Есть ли быстрая команда Git, чтобы увидеть старую версию файла?

1260

Есть ли команда в Git, чтобы увидеть (либо сбрасывать на stdout, либо в $PAGER или $EDITOR) конкретную версию определенного файла?

Теги:

9 ответов

1354

Вы можете использовать git show:

$ git show REVISION:path/to/file

Замените REVISION на вашу фактическую ревизию (может быть Git commit SHA, имя тега, имя ветки, относительное имя фиксации или любой другой способ идентификации фиксации в Git)

Например, чтобы просмотреть версию файла src/main.c с 4 src/main.c, используйте:

$ git show HEAD~4:src/main.c

Обратите внимание, что путь находится из корня репозитория, если только он не начинается с./или../, чтобы указать относительный путь. Для Git для Windows требуется косая черта даже в пути по отношению к текущему каталогу. Для получения дополнительной информации ознакомьтесь с man-страницей git-show.

  • 4
    Это на самом деле не работает - вы пробовали это? Для "git show HEAD: path / to / file.c" я получаю ошибку "неоднозначный аргумент".
  • 0
    И если я просто сделаю «git-show path / to / file.c», команда завершится успешно без вывода.
Показать ещё 28 комментариев
232

Выполнение этого по дате выглядит следующим образом:

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt

Обратите внимание, что HEAD@{2013-02-25} означает "где HEAD был в 2013-02-25" в этом репозитории (используя reflog), а не "последнее совершение до 2013 года" -02-25 в этой ветке в истории ".

  • 3
    Потрясающие. Экономит мое время, вместо того, чтобы ходить на github и смотреть на коммит.
  • 0
    «Точка» на пути к файлу была моей проблемой. Спасибо!
Показать ещё 4 комментария
108

Если вам нравятся графические интерфейсы, вы можете использовать gitk:

  • запустить gitk с помощью:

    gitk /path/to/file
    
  • Выберите версию в верхней части экрана, например. по описанию или дате. По умолчанию в нижней части экрана отображается разность для этой ревизии (соответствующая переключателю "patch" ).

  • Чтобы просмотреть файл для выбранной версии:

    • Нажмите на кнопку "Дерево". Это покажет корень дерева файлов в этой ревизии.
    • Перейдите к файлу.
  • 7
    Это также работает с Tig , который является средством просмотра git repo curses.
  • 1
    @Paul Slocum: Может быть потому, что эта команда не является обычной командой, а не встроенной в git. Я думаю, что эта команда работает только для Windows.
Показать ещё 3 комментария
74

Вы также можете указать commit hash (часто также называемый commit ID) с помощью команды git show.


В двух словах

git show <commitHash>:/path/to/file


Шаг за шагом

  • Показать журнал всех изменений для данного файла с помощью git log /path/to/file
  • В списке показанных изменений отображается commit hash, например commit 06c98... (06c98... являющийся хешем фиксации)
  • Скопируйте commit hash
  • Запустите команду git show <commitHash>:/path/to/file, используя commit hash для шага 3 и path/to/file для шага 1.

Примечание. добавление ./ при определении относительного пути кажется важным, то есть git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html.

  • 0
    если вы не знаете путь к файлу, используйте git show <SHA1> --name-only чтобы получить его.
  • 0
    эта команда op - даже автоматически завершается из памяти - проверена на удаленном каталоге ... не может получить больше op, чем этот gg
Показать ещё 1 комментарий
32

В дополнение к Джим Хунцикер ответьте,

вы можете экспортировать файл из ревизии как,

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt

Надеюсь, что это поможет:)

15

git log -p покажет вам не только журналы фиксации, но и разницу каждого фиксации (за исключением коммитов). Затем вы можете нажать /, ввести имя файла и нажать enter. Нажмите n или p, чтобы перейти к следующему/предыдущему вхождению. Таким образом, вы не просто увидите изменения в файле, но также информацию о фиксации.

  • 3
    Похоже, git log -pm также показывает коммиты слияния.
  • 0
    Вы также можете запустить git log -p -- filename.txt чтобы ограничить историю только нужным файлом.
2

Вы можете использовать такой сценарий, чтобы сбрасывать все версии файла для разделения файлов:

например

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

Получите сценарий здесь как ответ на другой подобный вопрос

  • 1
    git_root , git_log_short и git_log_message_for_commit отсутствуют.
  • 0
    Хороший улов! Я дважды опубликовал этот ответ в 2 разных местах, и просто удалил этот и связал его с другим, где люди рассказывали мне об этом раньше ... спасибо @mogsie!
Показать ещё 1 комментарий
1

Помощник для извлечения нескольких файлов из данной версии

При попытке разрешить конфликты слияния этот помощник очень полезен:

#!/usr/bin/env python3

import argparse
import os
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
    file_relative = os.path.relpath(os.path.abspath(path), toplevel)
    base, ext = os.path.splitext(path)
    new_path = base + '.old' + ext
    with open(new_path, 'w') as f:
        subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)

GitHub вверх по течению.

Использование:

git-show-save other-branch file1.c path/to/file2.cpp

Результат: следующие содержат альтернативные версии файлов:

file1.old.c
path/to/file2.old.cpp

Таким образом, вы сохраняете расширение файла, поэтому ваш редактор не будет жаловаться и может легко найти старый файл, расположенный рядом с новым.

  • 0
    Вы создали приложение Python для запуска командной строки.
  • 0
    @MickeyPerlstein, если вы можете добиться того же интерфейса с лучшей реализацией, я весь слух.
Показать ещё 2 комментария
0

git show -1 filename.txt >, чтобы проверить последнюю версию файла

git show -2 filename.txt >, чтобы проверить последнюю 2-ую версию файла

git show -3 fielname.txt >, чтобы проверить последнюю 3-ю версию файла

  • 5
    Эти команды показывают различия с текущей версией для меня, но не показывают весь файл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню