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

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

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

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

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

3 ответа

Решение

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

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

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

git log -p -1 <commit>

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

  • -p (также -u или же --patch) скрыто git-log man-страница, и на самом деле это опция отображения git-diff, При использовании с log, он показывает патч, который будет сгенерирован для каждого коммита, вместе с информацией о коммите и скрывает коммиты, которые не касаются указанного <path>, (Это поведение описано в пункте --full-diff, что приводит к отображению полной разницы каждого коммита.)
  • -1 показывает только самое последнее изменение указанного файла (-n 1 можно использовать вместо -1); в противном случае отображаются все отличные от нуля различия этого файла.
  • --follow требуется, чтобы увидеть изменения, которые произошли до переименования.

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

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

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

  • Я узнал log -p благодаря этому ответу.
  • Благодарим FranciscoPuga и этот ответ за показ мне --follow вариант.
  • Благодарим КрисБетти за упоминание -n 1 вариант и ататко за упоминание -1 вариант.
  • Благодарим sweaver2112 за то, что я действительно прочитал документацию и выяснил, что -p "означает" семантически.

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

git diff <commit> <path>

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

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

git diff HEAD^^ myfile

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

gitk <file>

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

Другие вопросы по тегам