git diff файл проти його останньої зміни


236

Чи можна отримати git, щоб створити різницю між певним файлом, який він існує зараз, і таким, який існував до останнього комітету, який його змінив?

Тобто, якщо ми знаємо:

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

Потім git diff 456def myfileвідображається остання зміна мого файлу. Можна зробити те ж саме без знань, вироблених git log; що змінилося в 123abc?


8
Я вважаю за краще використовуватиgit diff HEAD^ <file_path>
asgs

4
@asgs - не робити те , що я просив (з двох причин - HEAD^це 123abc, HEAD^^є 456def, і , якщо є інші коммітов , які не впливають на цей файл , то HEAD^ставиться до них)
Chowlett

Ви маєте рацію, пропустили частину "останнього зобов'язання, що змінило її"
асг

Відповіді:


215

Це існує, але насправді це особливість git log:

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

Зауважте, що -pтакож можна використовувати, щоб показати, вбудований текст відрізняється від одного коміту:

git log -p -1 <commit>

Використовувані параметри:

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

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

Щоб побачити зміни старих версій, просто прокрутіть журнал або вкажіть комітку або тег, з якого можна запустити журнал. (Звичайно, якщо вказати комітку або тег, ви повернетесь до початкової проблеми з'ясування того, що є правильним фіксацією чи тегом.)

Кредит, якщо належить кредит:

  • Я виявив log -pзавдяки цій відповіді .
  • Заслуга FranciscoPuga і ця відповідь за те, що мені показали --followваріант.
  • Кредит ChrisBetti за згадку про -n 1варіант та atatko для згадування -1варіанту.
  • Заслуга sweaver2112 за те, що я насправді прочитав документацію і з'ясував, що -p"означає" семантично.

6
Це було чудовим рішенням для мене. Показав кожну комісію та її відмінності в поточному файлі, коли я бігавgit log -p filename
Іен Джеймісон

4
Ідеально. Побачити лише останню зміну, це так само просто, як додавання -n 1параметра. git log -p -n 1 filename
Кріс Бетті

@ChrisBetti Спасибі; Я це включив у свою відповідь!
Кайл Странд

1
-n 1можна також замінити -1, це не змінює результат. Я просто віддаю перевагу синтаксису:git log -p -1 filename
atatko

1
є корисний варіант "--skip = [n]". Ви можете ввести git log -p -1 --skip=1 <path>для відображення другої комісії.
Maciek zioziński

220

Одним із способів використання git diff є:

git diff <commit> <path>

І поширений спосіб посилатися на один комітет останнього коміту - це відносний шлях до фактичної ГОЛОВИ. Ви можете посилатися на попередні комісії як HEAD ^ (у вашому прикладі це буде 123abc) або HEAD ^^ (456def у вашому прикладі) тощо.

Тож відповідь на ваше запитання:

git diff HEAD^^ myfile

6
О, звичайно. Я намагався HEAD^, але, звичайно, нічого не дало. Не думав спробувати HEAD^^.
Chowlett

17
Можливо, простіший синтаксис для давно HEAD~2
вчинених

19
Це неправда (принаймні, для Git 1.9.0), що HEAD^^ myfileнасправді стосуватиметься другого до останнього комітету, який змінився myfile; це стосуватиметься другого останнього комітету. Чи є спосіб вказати "Я хочу бачити останню зміну, внесену до цього файлу", не вказуючи (частину) хеш-файлу чи підрахунку кількості комітетів між останньою зміною, внесеною до цього файлу, та поточною версією?
Кайл Странд

3
Гм, схоже git log -p, досить близько.
Кайл Странд

30
нижченадзна причина: питання задається "між певним файлом, яким він є зараз, і як він існував до останнього комітету, який його змінив ", але якщо файл не був змінений в останньому загальному комітеті, ця відповідь не працює.
Кріс Бетті

8

Якщо ви добре використовуєте графічний інструмент, це працює дуже добре:

gitk <file>

gitk тепер показує всі коміти, де файл було оновлено. Позначення комісії покаже вам різницю в порівнянні з попередньою комісією у списку. Це також працює для каталогів, але тоді ви також можете вибрати файл для розрізнення для вибраного комітету. Супер корисно!


1
Також дуже корисно: git difftool HEAD^ fileабоgit difftool -d HEAD^ path
ForeverLearning
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.