Есть ли быстрая команда Git, чтобы увидеть старую версию файла? - PullRequest
1342 голосов
/ 03 декабря 2008

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

Ответы [ 9 ]

1528 голосов
/ 03 декабря 2008

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

$ git show REVISION:path/to/file

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

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

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

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

235 голосов
/ 07 марта 2013

По дате это выглядит так:

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

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

106 голосов
/ 19 декабря 2012

Если вам нравятся GUI, вы можете использовать gitk:

  1. начать игру с:

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

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

    • Нажмите на кнопку «дерево». Это покажет корень дерева файлов в этой ревизии.
    • Разверните файл.
74 голосов
/ 03 ноября 2016

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


В двух словах

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


Шаг за шагом

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

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

36 голосов
/ 30 апреля 2014

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

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

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

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

15 голосов
/ 06 мая 2016

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

7 голосов
/ 13 декабря 2018

Чтобы быстро увидеть различия со старыми ревизиями файла:

git show -1 filename.txt> для сравнения с последней ревизией файла

git show -2 filename.txt> для сравнения со 2-й последней ревизией

git show -3 fielname.txt> для сравнения с последней 3-ей последней ревизией

3 голосов
/ 30 октября 2017

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

, например

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

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

0 голосов

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

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

#!/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 upstream .

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...