Jak zobaczyć zmiany w Git commit?

1545

Kiedy to git diff COMMITwidzę, widzę zmiany między tym zatwierdzeniem a HEAD (o ile mi wiadomo), ale chciałbym zobaczyć zmiany dokonane przez ten pojedynczy zatwierdzenie.

Nie znalazłem żadnych oczywistych opcji na diff/ log, które dadzą mi takie wyjście.

laktak
źródło
4
możliwy duplikat Stenografii dla diff git commit z rodzicem?
Chris Maes,

Odpowiedzi:

1970

Aby zobaczyć różnicę dla określonego COMMITskrótu:

git diff COMMIT~ COMMITpokaże ci różnicę między COMMITprzodkiem tego a COMMIT. Zobacz strony man dla git diff, aby uzyskać szczegółowe informacje na temat polecenia i gitrevisions na temat ~notacji i jej przyjaciół.

Alternatywnie git show COMMITzrobi coś bardzo podobnego. (Dane zatwierdzenia, w tym jego różnice - ale nie dla zatwierdzeń scalania.) Zobacz stronę man git show .

Nevik Rehnel
źródło
17
Należy pamiętać, że ^należy cytować w skorupach Thomsona i Bourne'a (synonim |tam) i rcjego pochodnych (operator karetki) oraz w zshwłączonej rozszerzonej notglobie ( operator globowania)
Stephane Chazelas
3
Zauważ, że HEAD^implikuje to pierwszy rodzic, jeśli zatwierdzenie ma wielu rodziców (tj. Scalenie zatwierdzenia).
Mansour
23
git diff COMMIT~ COMMITdziała dla mnie, zauważ tyldę zamiast karetki. Używam gita w wersji 2.6.1.windows.1 na Windows 10.
Juuso Ohtonen
14
@tradetree: słowo COMMIT należy zastąpić nazwą jakiegoś zatwierdzenia, np. suma SHA.
Nick Matteo
91
Wydaje mi się, że git show jest bardziej odpowiedni do tego pytania i powinien być pierwszą sugestią wspomnianą wcześniej.
pypmannetjies
496

Jak wspomniano w „ Skrót dla różnic git commit z rodzicem? ”, Możesz również używać git diffz:

git diff COMMIT^!

lub

git diff-tree -p COMMIT

W przypadku git show musisz (aby skupić się na samym diff) wykonać:

git show --color --pretty=format:%b $COMMIT

Ten COMMITparametr to zatwierdzenie :

Obiekt zatwierdzenia lub obiekt, który można rekurencyjnie odnieść do obiektu zatwierdzenia. Poniżej przedstawiono wszystkie zatwierdzenia: obiekt zatwierdzenia, obiekt znacznika, który wskazuje na obiekt zatwierdzenia, obiekt znacznika, który wskazuje na obiekt znacznika, który wskazuje na obiekt zatwierdzenia itp.

Zobacz gitrevision „OKREŚLANIE ZMIAN”, aby odwołać się do zatwierdzenia.
Zobacz także „ Co oznacza drzewko w Git? ”.

VonC
źródło
369

Możesz także wypróbować ten prosty sposób:

git show <COMMIT>
Lakhan
źródło
2
Wydaje się, że robi to coś zupełnie innego
Nędzna Zmienna
3
Pokazuje tylko komunikat zatwierdzenia. Nie różni się zmiany kodu zastosowane dla tego zatwierdzenia.
k0pernikus,
1
Tak? Nareszcie w ostatnich wersjach git ...
Davy
2
To powinna być zaktualizowana poprawna odpowiedź
Scott Skiles
1
To powinna być odpowiedź.
Roel
77

git show pokazuje zmiany wprowadzone w ostatnim zatwierdzeniu.

Odpowiednik git show HEAD.

git show HEAD~1 zabiera cię z powrotem 1 zatwierdzenie.

Adam Salma
źródło
45

Zwyklę robię:

git diff HEAD~1

Aby pokazać zmiany dotyczące ostatniego zatwierdzenia. Jeśli masz więcej zatwierdzeń, po prostu zwiększ liczbę 1 do liczby różnic, które chcesz zobaczyć.

Alex
źródło
34

Najpierw uzyskaj identyfikator zatwierdzenia za pomocą,

git log #to list all

Lub

git log -p -1 #last one commit id

Skopiuj identyfikator zatwierdzenia.

Teraz używamy dwóch metod, aby wyświetlić listę zmian z konkretnego zatwierdzenia,

Metoda 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Metoda 2:

git show commit_id
For example: git show 1c6a600a
Mohideen bin Mohammed
źródło
2
Co to ^!znaczy?
Martín Coll
2
^! jest skrótem dla zatwierdzenia ^ .. zatwierdzenie, co oznacza, że ​​wykluczy wszystkich rodziców i sprawdzi różnice w tym zatwierdzeniu
Mohideen bin Mohammed
Nie jestem ekspertem, ale mam przypadek (z udziałem wielu gałęzi), w którym git log c ^! nie jest dokładnie taki sam jak git log c ^ .. c. W rzeczywistości jest o wiele lepiej: git log c ^ .. c wyświetlał zbyt wiele wpisów, podczas gdy git log c ^! zrobiłem dobrą rzecz, więc tego szukałem od dawna
user829755
32
git show <commit_sha>

To pokaże ci, co jest w tym zatwierdzeniu. Myślę, że możesz zrobić zasięg, po prostu umieszczając spację między dwoma shasami zatwierdzającymi.

git show <beginning_sha> <ending_sha>

co jest bardzo pomocne, jeśli często aktualizujesz dane, ponieważ dzienniki funkcji będą znajdować się w jednym rzędzie.

Iwnnay
źródło
25

Ze strony podręcznika dla git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Użyj trzeciego w środku:

git diff [options] <parent-commit> <commit>

Również z tej samej strony podręcznika u dołu, w sekcji Przykłady :

$ git diff HEAD^ HEAD      <3>

Porównaj wersję przed ostatnim zatwierdzeniem i ostatnim zatwierdzeniem.

Wprawdzie jest to trochę mylące, byłoby mniej mylące jako

Porównaj najnowsze zatwierdzenie z zatwierdzeniem przed nim.


źródło
3
Twoje przeredagowanie dotyczyłoby git diff HEAD HEAD^.
Richard
git diff HEAD ^ HEAD nie wyświetla żadnych zmian.
user3690202
@ user3690202, co oznacza, że ​​nie ma żadnych zmian w wyświetlaniu. Czy tak jest w rzeczywistości?
Jak mogą nie być wyświetlane żadne zmiany? Jeśli chcesz zobaczyć ostatnie zatwierdzenie, na pewno, chyba że jest to całkowicie nowe repozytorium, będą pewne zmiany do wyświetlenia?
user3690202,
@ user3690202 możliwe jest dokonanie „pustego zatwierdzenia” za pomocą Git, które tak naprawdę nie zawiera żadnych zmian ze strony nadrzędnej, chociaż istnieje wbudowane zabezpieczenie, które sprawdza i zapobiega temu, chociaż jest to możliwe z opcją wiersza poleceń. Wątpię, byś celowo utworzył puste zatwierdzenie, więc inną możliwością jest to, że w jakiś sposób masz konwersję kończącą wiersz przed zatwierdzeniem (lub inne śmieszne białe znaki), co powoduje, że Git myśli, że tak naprawdę nie dokonano żadnych zmian. Na jakiej platformie używasz Git?
22

Wydaje się, że wykonują to zadanie; Używam go, aby pokazać, co zostało wniesione przez scalenie.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
MichaelMoser
źródło
Czy to też zadziała git log? (z powodu stackoverflow.com/a/18585297/6309 )
VonC
16

Inna możliwość:

git log -p COMMIT -1
John_West
źródło
1
@GrantMcLean Tak, i to już jest najwyższa odpowiedź, więc nie wspominam o tym.
John_West
11

Możesz użyć, git diff HEAD HEAD^1aby zobaczyć różnicę z zatwierdzeniem nadrzędnym.

Jeśli chcesz tylko zobaczyć listę plików, dodaj --statopcję.

Irshu
źródło
To masz na myśli, git diff HEAD ^ 1 HEAD
Shibir Basak
Pamiętaj, że pokaże to, co dodałeś jako usunięty, ponieważ spowoduje odwrotne porównanie. Sposób, w jaki powinieneś czytać diffpolecenie, brzmi: co musiałbym zmienić w pliku, aby przejść z zatwierdzenia HEADdo zatwierdzenia HEAD^1?
plan mózgowy
9
git difftool COMMIT^ <commit hash>

jest również możliwe, jeśli skonfigurowałeś swój difftool.

Zobacz tutaj, jak skonfigurować difftool, lub stronę podręcznika tutaj

Dodatkowo możesz użyć, git diff-tree --no-commit-id --name-only -r <commit hash>aby zobaczyć, które pliki zostały zmienione / zatwierdzone w skrócie do zatwierdzania zmian

Chand Priyankara
źródło
9

Podoba mi się poniższe polecenie do porównania konkretnego zatwierdzenia i jego ostatniego zatwierdzenia:

git diff <commit-hash>^-

Przykład:

git diff cd1b3f485^-
starcwl
źródło
6

Aby zobaczyć autora i czas, użyj zatwierdzenia git show COMMIT. Co da w wyniku coś takiego:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <[email protected]>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Jeśli chcesz zobaczyć, które pliki zostały zmienione, uruchom następujące polecenie z wartościami z powyższej linii Scal git diff --stat a2a2894 3a1ba8f.

Jeśli chcesz zobaczyć rzeczywistą różnicę, uruchom git --stat a2a2894 3a1ba8f

Nikita G.
źródło
„Jeśli chcesz zobaczyć rzeczywistą różnicę, uruchom git --stat a2a2894 3a1ba8f”. Myślę, że masz na myśli git diff a2a2894 3a1ba8finaczej unknown option: --stat.
Fruit
5

Aby sprawdzić pełne zmiany:

  git diff <commit_Id_1> <commit_Id_2>

Aby sprawdzić tylko zmienione / dodane / usunięte pliki:

  git diff <commit_Id_1> <commit_Id_2> --name-only

UWAGA : Aby sprawdzić różnicę bez zatwierdzenia pomiędzy, nie musisz umieszczać identyfikatorów zatwierdzenia.

bit_cracker007
źródło
4

Korzystam z Gita w wersji 2.6.1.windows.1 na Windows 10, więc potrzebowałem niewielkiej modyfikacji odpowiedzi Nevika (tylda zamiast karetki):

git diff COMMIT~ COMMIT

Inną opcją jest zacytowanie kursora:

git diff "COMMIT^" COMMIT
Juuso Ohtonen
źródło
3

To polecenie zapewni ci nadrzędny hash zatwierdzenia Git:

git log -n 2 <commit-hash>

Po tym git diff-tool <commit-hash> <parent-commit-hash>

Przykład:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <[email protected]>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <[email protected]>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Po tym

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
souparno majumder
źródło
2

Jeśli chcesz tylko zobaczyć zmiany w ostatnim zatwierdzeniu, po prostu ci to git showzapewni.

MyrionSC2
źródło
1

W przypadku sprawdzenia zmiany źródła w widoku graficznym,

$gitk (Mention your commit id here)

na przykład:

$gitk HEAD~1 
użytkownik272390
źródło
Nie rozumiem, dlaczego ta odpowiedź została odrzucona. Zgadzam się, że dobrym pomysłem jest korzystanie z wiersza poleceń i tekstów, ale gitk zawiera wiele przydatnych informacji.
ShellFish