git: Jak porównać zmienione pliki z poprzednimi wersjami po ściągnięciu?

117

Kiedy uruchamiam „git pull”, często chcę wiedzieć, co zmieniło się między ostatnią wersją pliku a nową. Powiedz, że chcę wiedzieć, co ktoś inny zaangażował w określony plik.

Jak to się robi?

Zakładam, że jest to "git diff" z niektórymi parametrami dla zatwierdzenia x w porównaniu z zatwierdzeniem y, ale nie mogę uzyskać składni. Wydaje mi się również, że "git log" jest trochę mylący i nie jestem pewien, skąd wziąć identyfikator zmiany mojej najnowszej wersji pliku w porównaniu z nową.

Doug
źródło
1
Może się okazać, że narzędzie graficzne gitk bardziej odpowiada Twoim gustom.
crazyscot
stackoverflow.com/questions/61002/… może być podobny do tego
VonC

Odpowiedzi:

158

Istnieje wiele wspaniałych sposobów określania zatwierdzeń - zobacz sekcję określania rewizji,man git-rev-parse aby uzyskać więcej informacji. W takim przypadku prawdopodobnie chcesz:

git diff HEAD@{1}

Te @{1}środki „poprzednia pozycja ref Mam określonym” tak, że ma wartość co sprawdził się wcześniej - tuż przed pociągnięciem. Możesz dodać HEADtam koniec, jeśli masz również jakieś zmiany w swoim drzewie roboczym i nie chcesz widzieć ich różnic.

Nie jestem pewien, o co prosisz z „identyfikatorem zatwierdzenia mojej najnowszej wersji pliku” - zatwierdzenie „ID” (skrót SHA1) to 40-znakowy znak szesnastkowy na górze każdego wpisu w wyniku z git log. To hash dla całego zatwierdzenia, a nie dla danego pliku. Naprawdę nigdy nie potrzebujesz więcej - jeśli chcesz porównać tylko jeden plik w ciągu pull, zrób

git diff HEAD@{1} filename

To jest ogólna sprawa - jeśli chcesz wiedzieć o stanie pliku w danym zatwierdzeniu, określasz zatwierdzenie i plik, a nie identyfikator / hash specyficzny dla pliku.

Cascabel
źródło
Poprzedni post z linkiem VonC mówi w zasadzie to samo, co ten, ale wyjaśnienie jest nieco inne, więc na razie to zostawię. (Używa również @{1}jako skrótu HEAD@{1})
Cascabel
prawda, ale podoba mi się też wyjaśnienie. +1
VonC
To jest dokładnie to, czego szukałem. Dziękuję za wyjaśnienie.
Lucapette
+1 za to, co szukałem w Google. Byłoby wspaniale, gdyby to zostało wybrane jako odpowiedź i wpadło na szczyt ... :)
longda
@longda Jeśli sortujesz według głosów (co uważałem za domyślne), powinno już znajdować się na górze.
Cascabel
57

Lubię używać:

git diff HEAD^

Lub jeśli chcę porównać tylko określony plik:

git diff HEAD^ -- /foo/bar/baz.txt
kadizm
źródło
5
-1: HEAD^jest zobowiązaniem rodzica, a nie wcześniejszympull
CharlesB
1
Jeśli HEADjest zatwierdzeniem scalającym, HEAD^jest pierwszym zatwierdzeniem nadrzędnym, więc tak, może to być zatwierdzenie przed pull. Aby uzyskać drugiego rodzica (dla scalenia dwukierunkowego), użyj HEAD^2. Ale z drugiej strony powyższa odpowiedź nie jest tak naprawdę odpowiedzią na pytanie w pierwszej kolejności, więc pozostawiając -1 ;-)
Michael Wild
Dziękuję za wyjaśnienie. Nie przeczytałem zbyt dokładnie pytania, ponieważ szukałem czegoś innego, a ten link pojawił się wysoko na stronie wyników. Pomyślałem, że zadzwonię, ponieważ jestem nowym użytkownikiem i nie mam żadnej karmy (jeśli tak się to nazywa na SO). Moja wina =)
cadizm
3
@MichaelWild to może nie być to, o co pytał pytający, ale właśnie tego szukałem, kiedy to znalazłem. To było dla mnie przydatne. Głosowanie za.
John Dvorak
To jest to, co robi TortoiseGit „Porównaj z poprzednią wersją”. I właśnie tego szukałem.
Fabien Haddadi
15

Jeśli wykonasz strita git pull, albo zostaniesz „przewinięty do przodu”, albo połączysz nieznaną liczbę zatwierdzeń ze zdalnego repozytorium. Dzieje się to jednak jako jedna akcja, więc ostatnie zatwierdzenie, w którym byłeś bezpośrednio przed ściągnięciem, będzie ostatnim wpisem w reflogu i będzie dostępne jako HEAD@{1}. Oznacza to, że możesz:

git diff HEAD@{1}

Jednak zdecydowanie zalecałbym, aby jeśli jest to coś, co często robisz, powinieneś rozważyć wykonanie a git fetchi sprawdzenie pobranej gałęzi przed ręcznym scaleniem lub ponownym bazowaniem na niej. Np. Jeśli jesteś na master i zamierzasz przyciągnąć origin / master:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master
CB Bailey
źródło
Niezłe użycie git logzamiast git difftutaj (nawet jeśli składnia jest nieco niespójna między „..” dla git logi „…” dla git diff;) +1 Zobacz stackoverflow.com/questions/53569/… i stackoverflow.com/questions / 850607 /…
VonC
Na szczęście, jeśli użyjesz składni '..' w poleceniu git diff, git "robi właściwą rzecz".
CB Bailey