Plik git diff w stosunku do ostatniej zmiany

236

Czy jest możliwe, aby git wytworzył różnicę między konkretnym plikiem, jaki istnieje teraz i jaki istniał przed ostatnim zatwierdzeniem, które go zmieniło?

To znaczy, jeśli wiemy:

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

Następnie git diff 456def myfilepokazuje ostatnią zmianę na mój plik. Można to zrobić bez wiedzy wytworzonej przez git log; co zmieniło się w 123abc?

Chowlett
źródło
8
Wolę używaćgit diff HEAD^ <file_path>
asgs
4
@asgs - Nie robi tego, o co prosiłem (z dwóch powodów - HEAD^jest 123abc, HEAD^^jest 456def; a jeśli były inne zatwierdzenia, które nie wpłynęły na ten plik, to HEAD^odnosi się do nich)
Chowlett
Masz rację, przegapiłeś część „ostatniego zatwierdzenia, która to zmieniła”
ass

Odpowiedzi:

215

To istnieje, ale w rzeczywistości jest to cecha git log:

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

Zauważ, że -pmożna go również użyć do wyświetlenia różnic wbudowanych z pojedynczego zatwierdzenia:

git log -p -1 <commit>

Zastosowane opcje:

  • -p(też -ulub --patch) jest ukryty deeeeeeeep na git-logstronie podręcznika i jest tak naprawdę opcją wyświetlania dla git-diff. W przypadku użycia z logpokazuje poprawkę, która byłaby generowana dla każdego zatwierdzenia , wraz z informacją o zatwierdzeniu - i ukrywa zatwierdzenia, które nie dotykają określonego <path>. (To zachowanie jest opisane w paragrafie --full-diff, który powoduje wyświetlenie pełnej różnicy każdego zatwierdzenia.)
  • -1pokazuje tylko ostatnią zmianę w podanym pliku ( -n 1można użyć zamiast -1); w przeciwnym razie pokazywane są wszystkie niezerowe różnice tego pliku.
  • --follow jest wymagane, aby zobaczyć zmiany, które wystąpiły przed zmianą nazwy.

O ile mi wiadomo, jest to jedyny sposób, aby natychmiast zobaczyć ostatni zestaw zmian dokonanych w pliku bez użycia git log(lub podobnego) do zliczenia liczby wprowadzających zmian lub określenia skrótu zatwierdzenia.

Aby zobaczyć zmiany starszych wersji, przewiń dziennik lub określ zatwierdzenie lub znacznik, od którego chcesz rozpocząć dziennik. (Oczywiście określenie zatwierdzenia lub znacznika powoduje powrót do pierwotnego problemu z ustaleniem poprawnego zatwierdzenia lub znacznika.)

Kredyt, na który przysługuje kredyt:

  • Odkryłem log -pdzięki tej odpowiedzi .
  • Podziękowania dla FranciscoPuga i ta odpowiedź za pokazanie mi --followopcji.
  • Podziękowania dla ChrisBetti za wzmiankę o -n 1opcji i atatko za wzmiankę o -1wariancie.
  • Podziękowania dla sweaver2112 za nakłonienie mnie do przeczytania dokumentacji i zrozumienia, co -p„znaczy” semantycznie.
Kyle Strand
źródło
6
To było dla mnie świetne rozwiązanie. Po uruchomieniu pokazałem każde zatwierdzenie i różnice w bieżącym plikugit log -p filename
Ian Jamieson
4
Idealny. Aby zobaczyć tylko ostatnią zmianę, jest to tak proste, jak dodanie -n 1parametru. git log -p -n 1 filename
Chris Betti,
@ChrisBetti Thanks; Włączyłem to do mojej odpowiedzi!
Kyle Strand
1
-n 1można również zastąpić przez -1, nie zmienia to wyniku Wolę tylko składnię:git log -p -1 filename
atatko
1
jest przydatna opcja „--skip = [n]”. Możesz wpisać, git log -p -1 --skip=1 <path>aby wyświetlić drugie zatwierdzenie.
Maciek Łoziński
220

Jednym ze sposobów korzystania z git diff jest:

git diff <commit> <path>

A powszechnym sposobem na odniesienie jednego zatwierdzenia ostatniego zatwierdzenia jest ścieżka względna do rzeczywistej HEAD. Możesz odwoływać się do poprzednich zatwierdzeń jako HEAD ^ (w twoim przykładzie będzie to 123abc) lub HEAD ^^ (456def w twoim przykładzie) itp.

Odpowiedź na twoje pytanie brzmi:

git diff HEAD^^ myfile
Francisco Puga
źródło
6
Och, oczywiście. Próbowałem HEAD^, ale oczywiście nic nie dało. Nie pomyślałem, żeby spróbować HEAD^^.
Chowlett
17
Może łatwiejsza składnia dla dawno zatwierdzonych:HEAD~2
ibizaman
19
To nieprawda (przynajmniej dla Git 1.9.0), że HEAD^^ myfilefaktycznie będzie się odnosić do ostatniego zatwierdzenia, które się zmieniło myfile; będzie odnosił się do ogólnego zatwierdzenia od ostatniego do ostatniego. Czy jest jakiś sposób, aby określić „Chcę zobaczyć ostatnią zmianę dokonaną w tym pliku” bez określania (części) skrótu zatwierdzania lub zliczania liczby zatwierdzeń między ostatnią zmianą wprowadzoną w tym pliku a bieżącą wersją?
Kyle Strand
3
Hm, wygląda na git log -pto , że jest całkiem blisko.
Kyle Strand
30
powód negatywny: pytanie dotyczy „między konkretnym plikiem, jaki jest teraz i jak istniał przed ostatnim zatwierdzeniem, które go zmieniło ”, ale jeśli plik nie został zmieniony w ostatnim ogólnym zatwierdzeniu, ta odpowiedź nie działa.
Chris Betti,
8

Jeśli wszystko w porządku, używając narzędzia graficznego, działa to bardzo dobrze:

gitk <file>

gitk pokazuje teraz wszystkie zatwierdzenia, w których plik został zaktualizowany. Oznaczenie zatwierdzenia pokaże różnicę w stosunku do poprzedniego zatwierdzenia na liście. Działa to również w przypadku katalogów, ale następnie można również wybrać plik do różnic dla wybranego zatwierdzenia. Super przydatne!

Martin G.
źródło
1
Bardzo przydatne: git difftool HEAD^ filelubgit difftool -d HEAD^ path
ForeverLearning