„git diff” zawsze pokazuje różnicę między dwoma zatwierdzeniami (lub zatwierdzeniem i katalogiem roboczym itp.).
Jakub Narębski
21
@ JakubNarębski, pyta, jak zobaczyć różnicę między zmianami wprowadzonymi przez jedno polecenie a zmianami wprowadzonymi przez inne zatwierdzenie. Innymi słowy, diff diffs lub interdiff.
psusi
1
a jeśli dodasz parametr --dirstat = pliki do polecenia diff, zrobisz bardzo ładny zrzut ekranu dokładnie tych projektów i plików, które zostaną zmienione, wraz z procentem zmiany. W ten sposób: git diff [numer-zatwierdzenia] [numer-zatwierdzenia] --dirstat = pliki
Óscar Ibáñez Fernández
Odpowiedzi:
605
możesz po prostu przekazać 2 zatwierdzenia do git diff, takie jak:
Zaletą używania git Apply vs. Patch jest to, że możesz dołączyć nazwy i niektóre inne zmiany, które są specyficzne dla git. Lubię używać git format-patch i git am.
Russell
58
Ta odpowiedź całkowicie nie odpowiada na pytanie, więc nie mam pojęcia, dlaczego ma tak wiele pozytywnych opinii. OP dokładnie pyta, jak NIE uzyskać pierwszego polecenia, które wydasz, a drugie nie ma z tym nic wspólnego.
psusi
3
Ta odpowiedź nie całkowicie nie odpowiada. Działa idealnie. Jeśli odłączysz późniejsze z dwóch zatwierdzeń, o których mowa, to zastosujesz różnicę do tego nowego oddziału, zobaczysz zmiany między dwoma zatwierdzeniami bez bólu głowy przerywanych zatwierdzeń.
Craig Labenz
142
Pytanie o różnicę / między / dwoma zatwierdzeniami bez uwzględnienia między nimi nie ma sensu. Zatwierdzenia to tylko migawki zawartości repozytorium; pytanie o różnicę między dwoma koniecznie obejmuje je. Pytanie zatem brzmi: czego tak naprawdę szukasz?
Jak sugerował William, wybieranie wiśni może dać ci deltę jednego zatwierdzenia opartego na drugim. To jest:
Pobiera zatwierdzenie „abcdef”, porównuje go do jego bezpośredniego przodka, a następnie stosuje tę różnicę do „012345”. Ta nowa różnica jest następnie pokazana - jedyną zmianą jest kontekst pochodzi od „012345”, a nie od bezpośredniego przodka abcdef. Oczywiście możesz mieć konflikty itp., Więc w większości przypadków nie jest to bardzo przydatny proces.
Jeśli jesteś zainteresowany samym abcdef, możesz:
$ git log -u -1 abcdef
To porównuje abcdef do jego bezpośredniego przodka, samego i jest zwykle tym, czego chcesz.
I oczywiście
$ git diff 012345..abcdef
daje wszystkie różnice między tymi dwoma zatwierdzeniami.
Pomogłoby to uzyskać lepszy obraz tego, co próbujesz osiągnąć - jak już wspomniałem, proszenie o różnicę między dwoma zatwierdzeniami bez tego, co pomiędzy, nie ma sensu.
Zgadzam się, że generalnie porównanie dwóch zatwierdzeń nie ma większego sensu. Ale git naprawdę dobrze mówi ci, jak powinieneś myśleć. Załóżmy, że masz dwie gałęzie, każda z odrębnymi zatwierdzeniami, które wyglądają, jakby wprowadzały te same zmiany w tych samych zestawach plików. Chciałbym móc użyć git, aby powiedzieć mi, czy te dwie łatki są takie same, bez konieczności ufania moim oczom. Myślę, że jest w tym użyteczna.
Chris Cleeland
9
@ChrisCleeland, narzędzie interdiff może się przydać w takim przypadku. Użyj git diff, aby uzyskać różnicę każdego zatwierdzenia względem jego bezpośredniego rodzica, a następnie użyj interdiff do porównania różnic.
bdonlan,
3
@ChrisCleeland, git nie przechowuje łatek. Przechowuje zawartość pliku. Ma schemat kompresji wykorzystujący delty, ale źródła delty niekoniecznie są skorelowane z faktyczną historią plików.
bdonlan,
11
Różnica między tymi dwoma zatwierdzeniami z wyłączeniem innych zatwierdzeń w ich odpowiednich gałęziach ma idealny sens: jeden zatwierdzenie został wybrany z drugiego, ale może mieć pewne subtelne różnice. Chcesz zobaczyć, jakie one są, bez zaśmiecania się wszystkimi innymi niepowiązanymi bzdurami, które różnią się między dwiema gałęziami.
psusi
2
Lub powiedz, że bazujesz na gałęzi funkcji i musisz rozwiązywać konflikty. Później porównanie origin/featurebranch#HEADz local/featurebranch#HEADmoże pomóc ci upewnić się, że nic nie zepsułeś podczas rozwiązywania konfliktu.
lefnire
91
Aby porównać dwa git zatwierdza 12345 i abcdef jako łaty, można użyć polecenia diff jako
@OneOfOne git diff <(git show 123456) <(git show abcdef)nie działa; diff <(...) <(...)robi. (Właśnie tego spróbowałem).
Menachem,
@Menachem git diff 123456 abcdef.
OneOfOne,
15
@OneOfOne To nie robi tego samego. Sugerujesz, aby porównać drzewa każdego zatwierdzenia, pokazując pojedynczą łatkę . To, co robię (i @plexoos), to porównywanie dwóch łat , z których każda została wprowadzona osobnymi zatwierdzeniami - innymi słowy, diffotrzymując wynik z dwóch diffs. Obejmuje to odczytywanie i porównywanie dwóch strumieni wejściowych. diff(GNU lub Unix diff) może to zrobić, podczas gdy git diffnie. Niektórzy mogą się zastanawiać, dlaczego ktoś chciałby to zrobić. Jestem w trakcie robienia tego teraz, usuwając połączenie, które poszło nie tak.
Menachem,
1
czy nie obejmie to gnu diff wszystkich metadanych w git diff?
joelb
61
git diff <a-commit> <another-commit> path
Przykład:
git diff commit1 commit2 config/routes.rb
Pokazuje różnicę w tym pliku między tymi zatwierdzeniami.
Może być również skrócony jako jedną wkładką właśnie jako odpowiedź przez @plexoos : diff <(git diff B A) <(git diff D A0)(taki sam wynik jak z pokazu git)
pogosama
14
Załóżmy, że chcesz zobaczyć różnicę między zatwierdzeniami 012345 a abcdef. Następujące czynności powinny robić, co chcesz:
Dzięki, to dobry pomysł, aby sprawdzić swój wynik po zgnieceniu zatwierdzeń. Na przykład możesz sprawdzić swój oddział za pomocą niezgniecionych zatwierdzeń i Cherry wybrać zgnieciony zatwierdzenie, aby zobaczyć, czy wszystko poszło gładko dzięki interaktywnemu rebase. Dodatkowo, gdy mistrz wyprzedza gałąź.
akostadinov,
10
A co z tym:
git diff abcdef 123456 | less
Przydatne jest po prostu zmniejszanie go, jeśli chcesz porównywać wiele różnych różnic w locie.
Moje aliasustawienia w ~/.bashrcpliku dla git diff:
alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits
Odpowiedzi:
możesz po prostu przekazać 2 zatwierdzenia do git diff, takie jak:
źródło
my.patch
w innym oddziale?Pytanie o różnicę / między / dwoma zatwierdzeniami bez uwzględnienia między nimi nie ma sensu. Zatwierdzenia to tylko migawki zawartości repozytorium; pytanie o różnicę między dwoma koniecznie obejmuje je. Pytanie zatem brzmi: czego tak naprawdę szukasz?
Jak sugerował William, wybieranie wiśni może dać ci deltę jednego zatwierdzenia opartego na drugim. To jest:
Pobiera zatwierdzenie „abcdef”, porównuje go do jego bezpośredniego przodka, a następnie stosuje tę różnicę do „012345”. Ta nowa różnica jest następnie pokazana - jedyną zmianą jest kontekst pochodzi od „012345”, a nie od bezpośredniego przodka abcdef. Oczywiście możesz mieć konflikty itp., Więc w większości przypadków nie jest to bardzo przydatny proces.
Jeśli jesteś zainteresowany samym abcdef, możesz:
To porównuje abcdef do jego bezpośredniego przodka, samego i jest zwykle tym, czego chcesz.
I oczywiście
daje wszystkie różnice między tymi dwoma zatwierdzeniami.
Pomogłoby to uzyskać lepszy obraz tego, co próbujesz osiągnąć - jak już wspomniałem, proszenie o różnicę między dwoma zatwierdzeniami bez tego, co pomiędzy, nie ma sensu.
źródło
origin/featurebranch#HEAD
zlocal/featurebranch#HEAD
może pomóc ci upewnić się, że nic nie zepsułeś podczas rozwiązywania konfliktu.Aby porównać dwa git zatwierdza 12345 i abcdef jako łaty, można użyć polecenia diff jako
źródło
git diff <(git show 123456) <(git show abcdef)
nie działa;diff <(...) <(...)
robi. (Właśnie tego spróbowałem).git diff 123456 abcdef
.diff
otrzymując wynik z dwóchdiff
s. Obejmuje to odczytywanie i porównywanie dwóch strumieni wejściowych.diff
(GNU lub Unixdiff
) może to zrobić, podczas gdygit diff
nie. Niektórzy mogą się zastanawiać, dlaczego ktoś chciałby to zrobić. Jestem w trakcie robienia tego teraz, usuwając połączenie, które poszło nie tak.Przykład:
Pokazuje różnicę w tym pliku między tymi zatwierdzeniami.
źródło
Aby sprawdzić pełne zmiany:
Aby sprawdzić tylko zmienione / dodane / usunięte pliki:
UWAGA : Aby sprawdzić różnicę bez zatwierdzenia pomiędzy, nie musisz umieszczać identyfikatorów zatwierdzenia.
źródło
Powiedzmy, że masz to
I chcesz się upewnić, że
A
to samoA0
.To załatwi sprawę:
źródło
diff <(git diff B A) <(git diff D A0)
(taki sam wynik jak z pokazu git)Załóżmy, że chcesz zobaczyć różnicę między zatwierdzeniami 012345 a abcdef. Następujące czynności powinny robić, co chcesz:
źródło
A co z tym:
Przydatne jest po prostu zmniejszanie go, jeśli chcesz porównywać wiele różnych różnic w locie.
źródło
Od wersji Git 2.19 możesz po prostu używać:
git range-diff rev1...rev2
- porównaj dwa drzewa zatwierdzeń, zaczynając od ich wspólnego przodkalub
git range-diff rev1~..rev1 rev2~..rev2
- porównaj zmiany wprowadzone przez 2 dane zmianyźródło
Moje
alias
ustawienia w~/.bashrc
pliku dlagit diff
:źródło
Moje
alias
ustawienia w~/.zshrc
pliku dlagit diff
:Dzięki @Jinmiao Luo
git diff HEAD~2 HEAD
całkowita zmiana między ostatnim 2. zatwierdzeniem a bieżącym.
HEAD
jest wygodneźródło
Napisałem skrypt, który wyświetla różnice między dwoma zatwierdzeniami, działa dobrze na Ubuntu.
https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc
źródło