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