Ponieważ już stworzyłem te obrazy, pomyślałem, że warto je wykorzystać w innej odpowiedzi, chociaż opis różnicy między ..
(kropka-kropka) a ...
(kropka-kropka-kropka) jest zasadniczo taki sam jak w odpowiedzi manojldsa .
Polecenie git diff
zazwyczaj pokazuje tylko różnicę między stanami drzewa między dokładnie dwoma punktami na wykresie zatwierdzenia. Te ..
i ...
notacje w git diff
mają następujące znaczenie:
Innymi słowy, git diff foo..bar
jest dokładnie taki sam jakgit diff foo bar
; oba pokażą różnicę między końcami dwóch gałęzi foo
i bar
. Z drugiej strony git diff foo...bar
pokaże Ci różnicę między „bazą scalającą” dwóch gałęzi a wierzchołkiem bar
. „Baza scalania” jest zwykle ostatnim wspólnym zatwierdzeniem między tymi dwiema gałęziami, więc to polecenie pokaże ci zmiany, które wprowadziła twoja praca bar
, ignorując wszystko, co zostało zrobione foo
w międzyczasie.
To wszystko, co trzeba wiedzieć o ..
i ...
notacje w git diff
. Jednak...
... częstym źródłem zamieszania jest tutaj ..
i ...
myśli subtelnie różne rzeczy, gdy używany w poleceniu takich jak git log
, który oczekuje zestaw zobowiązuje jak jeden lub więcej argumentów. (Wszystkie te polecenia kończą się git rev-list
na analizie listy zatwierdzeń z ich argumentów).
Znaczenie ..
i...
dla git log
można przedstawić graficznie, jak poniżej:
Tak, git rev-list foo..bar
pokazuje wszystko na oddział bar
, który nie jest również na oddziale foo
. Z drugiej strony git rev-list foo...bar
pokazuje wszystkie zatwierdzenia, które są w jednym foo
lub bar
, ale nie w obu . Trzeci diagram pokazuje tylko, że jeśli wypiszesz dwie gałęzie, otrzymasz zatwierdzenia, które są w jednym lub obu z nich.
Cóż, w każdym razie wydaje mi się to trochę mylące i myślę, że diagramy wykresów zatwierdzania pomagają :)
¹ Mówię tylko „zwykle”, ponieważ na przykład przy rozwiązywaniu konfliktów scalania git diff
wyświetli się trójstronne połączenie.
..
i...
wgit diff
i ich różne znaczenia wgit log
.