У меня есть Git-репозиторий, и я хотел бы посмотреть, как некоторые файлы выглядели несколько месяцев назад. Я нашел ревизию в тот же день; это 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
. Мне нужно посмотреть, как выглядит один файл, а также сохранить его как («новый») файл.
Мне удалось увидеть файл с помощью gitk
, но у него нет возможности сохранить его. Я попробовал с инструментами командной строки, ближе всего я получил:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
Однако эта команда отображает diff, а не содержимое файла. Я знаю, что позже смогу использовать что-то подобное PAGER=cat
и перенаправить вывод в файл, но я не знаю, как добраться до реального содержимого файла.
По сути, я ищу что-то вроде svn cat .
git
single-file
Милан Бабушков
источник
источник
git show
(бесполезно) использует другой синтаксис с двоеточием.git show 2c7cf:my_file.txt
>
Ответы:
Чтобы завершить свой собственный ответ, синтаксис действительно
Команда принимает обычный стиль ревизии, то есть вы можете использовать любое из следующего:
HEAD
+ х количество^
символовСовет Важно помнить, что при использовании "
git show
", всегда указывайте путь от корня хранилища , а не текущую позицию каталога.(Хотя Майк Морарти упоминает, что, по крайней мере с git 1.7.5.4, вы можете указать относительный путь, поставив "
./
" в начале пути - например:)
В Git 2.23+ (август 2019 г.) вы также можете использовать команду,
git restore
которая заменяет запутаннуюgit checkout
командуЭто восстановило бы на рабочем дереве только тот файл, который присутствует в коммите "source" (
-s
) SHA1 или ветвиsomebranch
.Чтобы восстановить также индекс:
(
-SW
: сокращение от--staged --worktree
)До git1.5.x это было сделано с помощью некоторой сантехники:
git ls-tree <rev>
показать список одного или нескольких объектов blob в коммите
git cat-file blob <file-SHA1>
cat файл, который был зафиксирован в определенной ревизии (аналог svn cat). используйте git ls-tree для получения значения заданного файла-sha1
git-ls-tree перечисляет идентификатор объекта для $ file в ревизии $ REV, это вырезано из вывода и используется в качестве аргумента для git-cat-file, который на самом деле должен называться git-cat-object, и просто выдает дамп этот объект на стандартный вывод.
Примечание: начиная с Git 2.11 (4 квартал 2016 г.), вы можете применить фильтр содержимого к
git cat-file
выводу!См. Коммит 3214594 , коммит 7bcf341 (09 сентября 2016 г.), коммит 7bcf341 (09 сентября 2016 г.) и коммит b9e62f6 , коммит 16dcc29 (24 августа 2016 г.) от Johannes Schindelin (
dscho
) .(Слиты Junio C Hamano -
gitster
- в фиксации 7889ed2 , 21 сент 2016)Примечание: "
git cat-file --textconv
" начал segfaulting недавно (2017 г.), что было исправлено в Git 2.15 (4 квартал 2017 г.)Смотрите коммит cc0ea7c (21 сентября 2017 г.) Джеффа Кинга (
peff
) .(Объединено Junio C Hamano -
gitster
- в коммите bfbc2fc , 28 сентября 2017 г.)Обратите внимание, что для переопределения / замены файла с прошлым содержимым вам больше не следует использовать запутанную
git checkout
команду , ноgit restore
(Git 2.23+, август 2019 г.)Это восстановит на рабочем дереве только тот файл, который присутствует в коммите "source" (
-s
) SHA1.Чтобы восстановить также индекс:
(
-SW
сокращение от--staged --worktree
)источник
git show
сути выдает содержимое вstdout
(стандартный вывод), вы можете просто перенаправить этот вывод в любой файл, который вы хотите ( tldp.org/LDP/abs/html/io-redirection.html ).git checkout [branch | revision] filepath
это правильная командаgit checkout
этого ваш файл будет переопределен другой версией,git show
что позволит вам сохранить его под другим именем, чтобы вы могли видеть и видеть обе версии (текущую и старую). Из вопроса неясно, хочет ли ОП заменить свою текущую версию старой.^^^
также можно записать в более общем плане, как~~~
или, лучше,~3
. Использование тильд также имеет то преимущество, что не вызывает сопоставления имен файлов некоторых оболочек (например, zsh).git rev-parse
обрабатывает ли pre-1.5.xrev:path
синтаксис? (В более позднем git вы можетеgit cat-file -p $REV:path
. Однако, онgit show
работает и для путей к каталогам, поэтому он не просто короче, он обычно ближе к тому, что нужно.)Если вы хотите заменить / перезаписать содержимое файла в вашей текущей ветке содержимым файла из предыдущего коммита или другой ветки, вы можете сделать это с помощью следующих команд:
или
Затем вам нужно будет зафиксировать эти изменения, чтобы они вступили в силу в текущей ветке.
источник
git show SHA1:PATH
решение печатает только в стандартный вывод.git help checkout
. Мне нужно было извлечь подкаталог с определенной даты, и, используя этот подход, я мог заставить этот синтаксис работать:git checkout @{YYYY-MM-DD} sub-dir
Вам необходимо указать полный путь к файлу:
источник
git show --name-only
, тоже достаточноfull/repo/path/to
и попытаетесь:,git show 27cf8e84:my_file.txt
вы будете вознаграждены сообщением типа: fatal: путь 'full / repo / path / to / my_file.txt' существует, но не 'my_file.txt' , Вы имели в виду «27cf8e84: полный / репо / путь / к / my_file.txt» или «27cf8e84: ./ my_file.txt»? Похоже, Git мог бы помочь напрямую, но решил быть педантичным здесь.Самый простой способ - написать:
где:
пример
Это сохранит my_file.txt из ревизии 27cf8e как новый файл с именем my_file.txt.OLD
Он был протестирован с Git 2.4.5.
Если вы хотите восстановить удаленный файл, вы можете использовать
HASH~1
(один коммит перед указанным HASH).ПРИМЕР:
источник
git log file/path/name.ext
В Windows с помощью Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
источник
И, чтобы красиво сбросить его в файл (по крайней мере на Windows) - Git Bash:
Эти
"
кавычки необходимы , так что сохраняет переводы строк.источник
git show
синтаксису, о котором я упоминал выше.Это поможет вам получить все удаленные файлы между коммитами без указания пути, полезно, если удалено много файлов.
источник
эта команда получает скопированный файл из определенного коммита.
источник
Получить файл из предыдущего коммита путем извлечения предыдущего коммита и копирования файла.
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
git checkout theBranchYouNoted
git commit -m "added file ?? from previous commit"
источник