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 myfile
pokazuje ostatnią zmianę na mój plik. Można to zrobić bez wiedzy wytworzonej przez git log
; co zmieniło się w 123abc?
git diff HEAD^ <file_path>
HEAD^
jest123abc
,HEAD^^
jest456def
; a jeśli były inne zatwierdzenia, które nie wpłynęły na ten plik, toHEAD^
odnosi się do nich)Odpowiedzi:
To istnieje, ale w rzeczywistości jest to cecha
git log
:Zauważ, że
-p
można go również użyć do wyświetlenia różnic wbudowanych z pojedynczego zatwierdzenia:Zastosowane opcje:
-p
(też-u
lub--patch
) jest ukryty deeeeeeeep nagit-log
stronie podręcznika i jest tak naprawdę opcją wyświetlania dlagit-diff
. W przypadku użycia zlog
pokazuje 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.)-1
pokazuje tylko ostatnią zmianę w podanym pliku (-n 1
moż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:
log -p
dzięki tej odpowiedzi .--follow
opcji.-n 1
opcji i atatko za wzmiankę o-1
wariancie.-p
„znaczy” semantycznie.źródło
git log -p filename
-n 1
parametru.git log -p -n 1 filename
-n 1
można również zastąpić przez-1
, nie zmienia to wyniku Wolę tylko składnię:git log -p -1 filename
git log -p -1 --skip=1 <path>
aby wyświetlić drugie zatwierdzenie.Jednym ze sposobów korzystania z git diff jest:
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:
źródło
HEAD^
, ale oczywiście nic nie dało. Nie pomyślałem, żeby spróbowaćHEAD^^
.HEAD~2
HEAD^^ myfile
faktycznie będzie się odnosić do ostatniego zatwierdzenia, które się zmieniłomyfile
; 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ą?git log -p
to , że jest całkiem blisko.Jeśli wszystko w porządku, używając narzędzia graficznego, działa to bardzo dobrze:
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!
źródło
git difftool HEAD^ file
lubgit difftool -d HEAD^ path