Есть ли в Git команда для просмотра (выгруженная в стандартный вывод, или в $PAGER
или $EDITOR
) конкретную версию определенного файла?
Как я могу просмотреть старую версию файла с помощью Git?
Ответы (10)
Вы можете использовать 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 checkout <revision>
.
- person mipadi; 03.01.2012
(commit):(path to file) | vim -
. Я считаю это намного лучше, чем использовать меньше / больше, которое используется по умолчанию.
- person laughing_man; 06.03.2014
git show <commit>:file
Все остальное просто дает самую последнюю версию.
- person Bobby Jack; 24.11.2014
git blame
, поэтому он должен быть в фиксации.
- person weberc2; 10.06.2016
REVISION
может быть хешем фиксации. См. Мой ответ: stackoverflow.com/a/40400259/759452
- person Adrien Be; 03.11.2016
git-show
отлично. Могу ли я переключать номера строк при использовании в командной строке?
- person KFL; 11.01.2017
git show <commit>:<file> | less -N
- person KFL; 11.01.2017
.
, например: git show HEAD:./subdir/main.c > foo
. Это работает в последних версиях git (проверено в git 2.8.3 на CentOS 7)
- person Eponymous; 06.09.2017
git add -p
. Есть ли способ увидеть весь файл в том виде, в каком он находится в индексе, прежде чем я его зафиксирую?
- person alpha_989; 30.04.2018
fatal: Invalid object name 'REVISION'.
- person Black; 14.07.2018
git show REVISION:path/to/file > path/to/file
.
- person mipadi; 24.10.2019
Выполнение этого по дате выглядит следующим образом , если фиксация произошла в течение последних 90 дней:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
Обратите внимание, что HEAD@{2013-02-25}
означает, где HEAD находился 25 февраля 2013 г. в этом репозитории (используя журнал ссылок), не последний коммит до 25.02.2013 в этой ветке в истории.
Это важно! Это означает, что по умолчанию этот метод работает только для истории за последние 90 дней. В противном случае нужно сделать так:
git show $(git rev-list -1 --before="2013-02-26" HEAD):./fileInCurrentDirectory.txt
master
вместо HEAD@{2013-02-25}
, если вы находитесь в ветке
- person funroll; 09.11.2015
git log --since='2016-04-28 23:59:59 +0100'
?
- person dumbledad; 03.05.2016
:
и перед именем файла.
- person Abhishek Divekar; 11.01.2018
Если вам нравятся графические интерфейсы, вы можете использовать gitk:
запустите gitk с:
gitk /path/to/file
Выберите версию в верхней части экрана, например по описанию или дате. По умолчанию в нижней части экрана отображается разница для этой ревизии (соответствует переключателю «патч»).
Чтобы увидеть файл выбранной ревизии:
- Click on the "tree" radio button. This will show the root of the file tree at that revision.
- Перейдите к своему файлу.
gitk REVISION /path/to/file
. Это может пригодиться, например, когда вы хотите проверить определенную версию.
- person Christian.D; 06.07.2016
Вы также можете указать 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
, чтобы получить его.
- person Tiina; 11.10.2017
debian
добавление ./
не имеет значения для пути.
- person Timo; 15.08.2020
Помимо ответа Джима Ханзикера,
вы можете экспортировать файл из ревизии как,
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
Надеюсь это поможет :)
Чтобы быстро увидеть различия со старыми версиями файла:
git show -1 filename.txt
> для сравнения с последней версией файла
git show -2 filename.txt
> для сравнения со второй последней ревизией
git show -3 fielname.txt
> для сравнения с последней 3-ей последней ревизией
git log -p
покажет вам не только журналы фиксации, но и разницу для каждой фиксации (кроме фиксации слияния). Затем вы можете нажать /
, ввести имя файла и нажать enter
. Нажмите n
или p
, чтобы перейти к следующему / предыдущему вхождению. Таким образом, вы увидите не только изменения в файле, но и информацию о фиксации.
git log -pm
также покажет коммиты слияния.
- person sanbor; 06.05.2016
git log -p -- filename.txt
, чтобы ограничить историю только желаемым файлом.
- person Jean Paul; 21.01.2019
СПОСОБ 1: (я предпочитаю этот способ, без возможности потери незафиксированных данных)
Найдите идентификатор фиксации с помощью:
git reflog
- # P3 # # P4 #
# P5 #
Откройте требуемый файл с помощью следующей команды:
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
Внесите необходимые изменения и сделайте новый коммит в нужную ветку
Вы можете использовать такой сценарий, чтобы выгрузить все версии файла в отдельные файлы:
e.g.
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
Получите скрипт здесь в качестве ответа на другой аналогичный вопрос.
git_root
, git_log_short
и git_log_message_for_commit
отсутствуют.
- person mogsie; 26.01.2018
Помощник для получения нескольких файлов из данной версии
Этот помощник очень полезен при попытке разрешить конфликты слияния:
#!/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
Таким образом, вы сохраните расширение файла, чтобы ваш редактор не жаловался и мог легко найти старый файл рядом с новым.
git checkout <sha1-of-the-commit-you-need>
, потомgit checkout HEAD
- person Homero Esmeraldo   schedule 04.01.2020