Jakie są różnice między double-dot".."i triple-dot" ... " w GIT diff commit ranges?

Jakie są różnice między następującymi poleceniami?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

Podręcznik diff mówi o tym:

Porównywanie gałęzi

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. zmiany między końcówkami tematu a gałęziami master.
  2. Jak wyżej.
  3. zmiany, które miały miejsce w gałęzi master od czasu, gdy gałąź tematyczna została z niej uruchomiona.
Ale dla mnie to nie do końca jasne.
Author: chrisjlee, 2011-08-31

4 answers

ponieważ już stworzyłem te obrazy, pomyślałem, że warto je wykorzystać w innej odpowiedzi, chociaż opis różnicy między .. (dot-dot) i ... (dot-dot-dot) jest zasadniczo taki sam jak w manojldsa odpowiedzi.

Polecenie git diff typowo1 pokazuje jedynie różnicę pomiędzy Stanami drzewa dokładnie pomiędzy dwoma punktami na wykresie zatwierdzania. Zapis .. i ... w git diff mają następujące znaczenia:

Ilustracja różnych sposobów definiowania commitów dla git diff

Innymi słowy, git diff foo..bar jest dokładnie taka sama jak git diff foo bar; oba pokażą Ci różnicę między końcówkami dwóch gałęzi foo i bar. Z drugiej strony, git diff foo...bar pokaże Ci różnicę między "bazą scalania" dwóch gałęzi i końcówką bar. "Merge base" jest zwykle ostatnim commitem wspólnym pomiędzy tymi dwoma gałęziami, więc to polecenie pokaże ci zmiany wprowadzone przez twoją pracę nad bar, ignorując wszystko zostało to zrobione na foo W międzyczasie.

To wszystko, co musisz wiedzieć o .. i ... zapisach w git diff. Jednak...


... powszechnym źródłem nieporozumień jest to, że .. i ... oznaczają subtelnie różne rzeczy, gdy są używane w poleceniach takich jak git log, które oczekują zbioru commitów jako jednego lub więcej argumentów. (Wszystkie te polecenia kończą się za pomocą git rev-list aby przeanalizować listę commitów z ich argumentów.)

Znaczenie .. i ... dla git log można pokazać graficznie jak poniżej:

Ilustracja różnych sposobów określania zakresów commitów dla git log

Więc, git rev-list foo..bar pokazuje Ci wszystko na branch bar, czego nie ma również na branch foo. Z drugiej strony git rev-list foo...bar pokazuje wszystkie commity, które są w foo lub bar, ale nie oba. Trzeci diagram pokazuje tylko, że jeśli wymienisz dwie gałęzie, otrzymasz commity, które są w jednej lub obu z nich.

Cóż, uważam, że to wszystko jest trochę mylące, i myślę, że commit wykresy pomoc:)

1 mówię tylko "typowo", ponieważ przy rozwiązywaniu konfliktów scalania, na przykład, git diff pokaże połączenie trójstronne.

 233
Author: Mark Longair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:42

Moja skonsolidowana Wersja .. vs ... with diff vs log

Diff vs Log & .. vs ..

 22
Author: DolphinDream,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 13:32:10

git diff foo master Różnica między Top (head) commitów foo i master.

git diff foo..master inny sposób na zrobienie tego samego.

git diff foo...master Diff od wspólnego przodka (git merge-base foo master) foo i master do końcówki master. Innymi słowy, pokazuje tylko zmiany, które gałąź master wprowadziła od czasu wspólnego przodka z foo.

Ten przykład z GitHub wyjaśnia, Kiedy używać tych dwóch:

Na przykład, jeśli utworzysz gałąź ' dev ' i dodasz funkcję do plik, następnie wróć do gałęzi "master" i usuń linię z README, a potem Uruchom coś takiego:

$ git diff master dev

Powie Ci, że funkcja została dodana z pierwszego pliku i linia została dodana do README. Dlaczego? Bo na gałęzi, README nadal ma oryginalną linię, ale na 'master' ją usunąłeś - więc bezpośrednie porównywanie migawek wygląda na to, że dodał je "dev".

To, co naprawdę chcesz porównać, to to, co " dev " zmieniło się od czasu twojego oddziały / align = "left" / Aby to zrobić, Git ma ładny mały skrót:

$ git diff master...dev
 22
Author: manojlds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 19:58:48
git diff foo master

Pokaże różnice między tematem a gałęzią master w tym momencie

git diff foo..master

To również pokaże różnice między tematem a gałęzią master w tym punkcie czasu

git diff foo...master

To pokaże wszystkie różnice pomiędzy tym, kiedy Temat został zrobiony z gałęzi i po

Więc pierwsze 2 polecenia są takie same, a ostatnia pokazuje szerszy widok w historii diff

 6
Author: italiano40,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 02:46:28