2012-04-16 3 views
163

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

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

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

Тогда git diff 456def myfile показывает последнее изменение Myfile. Можно сделать то же самое без знаний, полученных с помощью git log; что изменилось в 123abc?

+0

Я предпочитаю использовать 'git diff HEAD^' – asgs

+1

@asgs - Не делает то, что я просил (по двум причинам: 'HEAD ^' is '123abc',' HEAD ^^ 'is' 456def'; если бы были другие коммиты, которые не влияли на этот файл, то «HEAD ^» относится к ним) – Chowlett

+0

Вы правы, пропустили «последнее совершение, которое его изменило» часть – asgs

ответ

127

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

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

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

git log -p -1 <commit> 

Варианта, используемая:

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

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

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

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

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

Это было отличным решением для меня. Показывал каждую фиксацию и ее отличия от текущего файла, когда я запускал 'git log -p filename' –

+4

Perfect. Чтобы увидеть только последнее изменение, это так же просто, как добавить параметр' -n 1'. 'git log -p -n 1 filename' –

+0

@ChrisBetti Спасибо, я включил это в свой ответ! –

190

Один из способов использования Git различий является:

git diff <commit> <path> 

И распространенный способ передать один фиксацию последней фиксации как относительный путь к фактическому HEAD. Вы можете ссылаться на предыдущие коммиты, как РУКОВОДИТЕЛЬ^(в вашем примере это будет 123abc) или РУКОВОДИТЕЛЬ ^^ (456def в вашем примере), и т.д ...

Таким образом, ответ на ваш вопрос:

git diff HEAD^^ myfile 
+5

О, конечно. Я попробовал 'HEAD ^', но, конечно, ничего не производил. Не подумал попробовать «HEAD ^^». – Chowlett

+15

Возможно, более простой синтаксис для давно коммитов: 'HEAD ~ 2' – ibizaman

+16

Это неверно (по крайней мере, для Git 1.9.0), что' HEAD ^^ myfile' будет фактически ссылаться на второе-последнее коммит, myfile'; он будет относиться ко второму последнему фиксации в целом. Есть ли способ указать «Я хочу увидеть последнее изменение, внесенное в этот файл», не указав (часть) хеш фиксации или не подсчитав количество коммитов между последним изменением, внесенным в * этот файл * и текущей версией? –

3

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

gitk <file> 

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

+0

Также очень полезно: 'git difftool HEAD^file' или' git difftool -d HEAD^path' – ForeverLearning

Смежные вопросы