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

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

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

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

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

Ответ 1

Это действительно существует, но на самом деле это функция git log:

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

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

git log -p -1 <commit>

Используемые опции:

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

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

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

Кредит, при котором должен быть предоставлен кредит:

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

Ответ 2

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

git diff <commit> <path>

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

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

git diff HEAD^^ myfile

Ответ 3

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

gitk <file>

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