git diff файл против его последнего изменения

Можно ли заставить git создавать diff между определенным файлом, как он существует сейчас, и как он существовал до последнего коммита, который его изменил?

То есть если мы знаем:

<code>$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
</code>

затемgit diff 456def myfile показывает последнее изменение в мой файл. Можно ли сделать то же самое без знанияgit log; что изменилось в 123abc?

 asgs12 сент. 2017 г., 14:50
Я предпочитаю использоватьgit diff HEAD^ <file_path>
 asgs13 сент. 2017 г., 09:36
Вы правы, пропустили "последний коммит, который его изменил" часть
 Chowlett12 сент. 2017 г., 18:23
@asgs - не выполняет то, что я просил (по двум причинам -HEAD^ является123abc, HEAD^^ является456def; и если бы были другие коммитыthat didn't affect this file затемHEAD^ относится к ним)

Ответы на вопрос(3)

Если вы хорошо используете графический инструмент, это работает очень хорошо:

gitk <file>

gitk теперь показывает все коммиты, где файл был обновлен. Отметка коммита покажет вам разницу с предыдущим коммитом в списке. Это также работает для каталогов, но затем вы также можете выбрать файл для сравнения для выбранного коммита. Супер полезно!

 29 мая 2017 г., 20:04
Также очень полезно:git difftool HEAD^ file или жеgit difftool -d HEAD^ path

Один из способов использовать git diff:

git diff <commit> <path>

И общий способ отсылки одного коммита последнего коммита - это относительный путь к фактическому HEAD. Вы можете ссылаться на предыдущие коммиты как HEAD ^ (в вашем примере это будет 123abc) или HEAD ^^ (456def в вашем примере) и т. Д ...

Итак, ответ на ваш вопрос:

git diff HEAD^^ myfile
 Chowlett16 апр. 2012 г., 17:11
О Конечно. Я старалсяHEAD^Но, конечно, это ничего не дало. Не думал попробоватьHEAD^^.
 14 мар. 2014 г., 18:44
Хм, похожеgit log -p довольно близко
 04 сент. 2013 г., 19:19
Возможно, более простой синтаксис для давних коммитов:HEAD~2
 14 мар. 2014 г., 18:39
Это не правда (по крайней мере, для Git 1.9.0), чтоHEAD^^ myfile на самом деле будет ссылаться на предпоследний коммит, который изменилсяmyfile; это будет относиться ко второму по последнему коммиту в целом. Есть ли способ указать & quot; Я хочу увидеть последние изменения, внесенные в этот файл & quot; без указания (части) хеша коммитов или подсчета количества коммитов между последним изменениемthat file а текущая ревизия?
 11 мар. 2015 г., 14:15
причина понижения: вопрос задает вопрос "между конкретным файлом, каким он существует сейчас и каким он существовал раньшеthe last commit that changed it& quot ;, но если файл не был изменен при последней общей фиксации, этот ответ не работает.
Решение Вопроса

Это существует, но на самом деле это особенностьgit log:

git log -p [--follow] [-1] <path>

Обратите внимание, что-p также может использоваться для показа встроенного diff из одного коммита:

git log -p -1 <commit>

Используемые параметры:

-p (also -u or --patch) is hidden deeeeeeeep in the git-log man page, and is actually a display option for git-diff. When used with log, it shows the patch that would be generated for each commit, along with the commit information—and hides commits that do not touch the specified <path>. (This behavior is described in the paragraph on --full-diff, which causes the full diff of each commit to be shown.) -1 shows just the most recent change to the specified file (-n 1 can be used instead of -1); otherwise, all non-zero diffs of that file are shown. --follow is required to see changes that occurred prior to a rename.

Насколько я могу судить, это единственный способ сразу увидеть последний набор изменений, внесенных в файл, без использованияgit log (или аналогичный) для подсчета количества прошедших ревизий или определения хеша коммита.

Чтобы увидеть более ранние изменения ревизий, просто прокрутите журнал или укажите коммит или тег, с которого нужно начать журнал. (Конечно, указание коммита или тега возвращает вас к исходной проблеме выяснения, что такое правильный коммит или тег.)

Кредит, где кредит должен:

I discovered log -p thanks to this answer. Credit to FranciscoPuga and this answer for showing me the --follow option. Credit to ChrisBetti for mentioning the -n 1 option and atatko for mentioning the -1 variant. Credit to sweaver2112 for getting me to actually read the documentation and figure out what -p "means" semantically.
 06 окт. 2014 г., 20:58
Это было отличное решение для меня. Показывал каждый коммит и его отличия от текущего файла при запускеgit log -p filename
 27 апр. 2016 г., 22:47
-n 1 также может быть заменен-1, это не меняет результат, я просто предпочитаю синтаксис:git log -p -1 filename
 11 мар. 2015 г., 14:22
Отлично. Чтобы увидеть только последнее изменение, достаточно просто добавить-n 1 параметр.git log -p -n 1 filename
 11 июн. 2017 г., 14:48
есть полезная опция & quot; - skip = [n] & quot ;. Вы можете напечататьgit log -p -1 --skip=1 <path> для отображения второго коммита.
 02 окт. 2015 г., 00:17
@ChrisBetti Спасибо; Я включил это в свой ответ!

Ваш ответ на вопрос