Возможно ли заставить git создавать diff между определенным файлом, как он существует сейчас, и как он существовал до последнего коммита, который его изменил?
То есть если мы знаем:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
Затем git diff 456def myfile
показывает последнее изменение в мой файл. Возможно ли сделать то же самое без знания, созданного git log
; что изменилось в 123abc?
git diff HEAD^ <file_path>
HEAD^
это123abc
,HEAD^^
есть456def
, и , если есть другие коммиты , которые не влияют на этот файл , тоHEAD^
относится к ним)Ответы:
Это существует, но на самом деле это особенность
git log
:Обратите внимание, что
-p
также можно использовать для показа встроенного diff из одного коммита:Используемые параметры:
-p
(также-u
или--patch
) скрыт deeeeeeeep наgit-log
странице руководства и фактически является опцией отображенияgit-diff
. Когда используется сlog
, он показывает патч, который будет сгенерирован для каждого коммита , вместе с информацией о коммите - и скрывает коммиты, которые не касаются указанного<path>
. (Это поведение описано в параграфе--full-diff
, который приводит к отображению полного различий каждого коммита.)-1
показывает только самое последнее изменение указанного файла (-n 1
может использоваться вместо-1
); в противном случае отображаются все отличные от нуля различия этого файла.--follow
требуется, чтобы увидеть изменения, которые произошли до переименования.Насколько я могу судить, это единственный способ сразу увидеть последний набор изменений, внесенных в файл, без использования
git log
(или аналогичного) подсчета количества промежуточных ревизий или определения хэша фиксации.Чтобы увидеть более ранние изменения ревизий, просто прокрутите журнал или укажите коммит или тэг, с которого нужно начать журнал. (Конечно, указание коммита или тега возвращает вас к исходной проблеме выяснения, что такое правильный коммит или тег.)
Кредит, где кредит должен:
log -p
благодаря этому ответу .--follow
варианта.-n 1
варианта и Ататко за упоминание-1
варианта.-p
«означает» семантически.источник
git log -p filename
-n 1
параметр.git log -p -n 1 filename
-n 1
также можно заменить на-1
, это не меняет результат, я просто предпочитаю синтаксис:git log -p -1 filename
git log -p -1 --skip=1 <path>
чтобы отобразить второй коммит.Один из способов использовать git diff:
И общий способ отсылки одного коммита последнего коммита - это относительный путь к фактическому заголовку. Вы можете ссылаться на предыдущие коммиты как HEAD ^ (в вашем примере это будет 123abc) или HEAD ^^ (456def в вашем примере) и т. Д ...
Итак, ответ на ваш вопрос:
источник
HEAD^
, но, конечно, это ничего не дало. Не думал попробоватьHEAD^^
.HEAD~2
HEAD^^ myfile
фактически будет ссылаться на измененный второй-последний коммитmyfile
; это будет относиться ко всему последнему коммиту. Есть ли способ указать «Я хочу увидеть последнее изменение, внесенное в этот файл», не указав (часть) хеша коммитов или не посчитав количество коммитов между последним изменением, внесенным в этот файл, и текущей ревизией?git log -p
довольно близко.Если вы хорошо используете графический инструмент, это работает очень хорошо:
gitk теперь показывает все коммиты, где файл был обновлен. Отметка коммита покажет вам разницу с предыдущим коммитом в списке. Это также работает для каталогов, но затем вы также можете выбрать файл для сравнения для выбранного коммита. Супер полезно!
источник
git difftool HEAD^ file
илиgit difftool -d HEAD^ path