Есть ли в Git команда для просмотра (либо выгрузки в stdout, либо в $PAGER
или $EDITOR
) конкретной версии определенного файла?
git checkout <sha1-of-the-commit-you-need>
потомgit checkout HEAD
Есть ли в Git команда для просмотра (либо выгрузки в stdout, либо в $PAGER
или $EDITOR
) конкретной версии определенного файла?
git checkout <sha1-of-the-commit-you-need>
потомgit checkout HEAD
Ответы:
Вы можете использовать git show
с путем от корня хранилища ( ./
или ../
для относительного пути):
$ git show REVISION:path/to/file
Замените его REVISION
фактической ревизией (это может быть SHA коммита Git, имя тега, имя ветки, относительное имя коммита или любой другой способ идентификации коммита в Git)
Например, чтобы просмотреть версию файла <repository-root>/src/main.c
от 4 коммитов назад, используйте:
$ git show HEAD~4:src/main.c
Git для Windows требует прямой косой черты даже в путях относительно текущего каталога. Для получения дополнительной информации посетите страницу справочника git-show
.
Делать это по дате выглядит так:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
Обратите внимание, что HEAD@{2013-02-25}
в этом хранилище (где использовался reflog ) означает «где HEAD был 2013-02-25» , а не «последний коммит до 2013-02-25 в этой ветви в истории».
master
вместо HEAD@{2013-02-25}
, если вы находитесь на ветке
git log --since='2016-04-28 23:59:59 +0100'
?
Если вам нравятся графические интерфейсы, вы можете использовать gitk:
начать гитк с:
gitk /path/to/file
Выберите редакцию в верхней части экрана, например, по описанию или дате. По умолчанию в нижней части экрана отображается разница для этой ревизии (в соответствии с переключателем «patch»).
Чтобы просмотреть файл для выбранной ревизии:
gitk REVISION /path/to/file
. Это может пригодиться, если вы хотите проверить, например, с определенной версией.
Вы также можете указать 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
.
git show <SHA1> --name-only
для получения.
В дополнение к ответу Джима Хунзикера ,
Вы можете экспортировать файл из ревизии как,
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
Надеюсь это поможет :)
Чтобы быстро увидеть различия со старыми ревизиями файла:
git show -1 filename.txt
> сравнить с последней ревизией файла
git show -2 filename.txt
> сравнить со 2-ой последней ревизией
git show -3 fielname.txt
> сравнить с последней 3-ей последней ревизией
git log -p
покажет вам не только логи коммитов, но и различия каждого коммита (кроме коммитов слияния). Затем вы можете нажать /
, введите имя файла и нажмите enter
. Нажмите n
или, p
чтобы перейти к следующему / предыдущему вхождению. Таким образом, вы увидите не только изменения в файле, но и информацию о фиксации.
git log -pm
будет также показывать слияния коммитов.
git log -p -- filename.txt
чтобы ограничить историю только желаемым файлом.
Вы можете использовать такой скрипт, чтобы вывести все версии файла в отдельные файлы:
например
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
Получите скрипт здесь как ответ на другой похожий вопрос
git_root
, git_log_short
И git_log_message_for_commit
не хватает.
ПУТЬ 1: (Я предпочитаю этот путь)
git reflog
git diff-tree --no-commit-id --name-only -r <commitHash>
пример:
git diff-tree --no-commit-id --name-only -r d2f9ba4
// "d2f9ba4" это идентификатор коммита из "1."
git show <commitHash>:/path/to/file
пример:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
// "Src / ..." это путь к файлу от "2."
ПУТЬ 2:
git reflog
git reset --hard %commit ID%
git reset --hard c14809fa
Помощник для извлечения нескольких файлов из данной ревизии
При попытке разрешить конфликты слияния этот помощник очень полезен:
#!/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)
Применение:
git-show-save other-branch file1.c path/to/file2.cpp
Результат: следующие содержат альтернативные версии файлов:
file1.old.c
path/to/file2.old.cpp
Таким образом, вы сохраняете расширение файла, чтобы ваш редактор не жаловался и мог легко найти старый файл рядом с новым.