Jakie są różnice między podwójnymi kropkami „..” i potrójnymi kropkami „…” w zakresach zatwierdzania Git?
412
Niektóre polecenia Git przyjmują zakresy zatwierdzeń, a jedna poprawna składnia polega na oddzieleniu dwóch nazw zatwierdzeń dwiema kropkami .., a inna składnia używa trzech kropek ....
Zależy to od tego, czy używasz logpolecenia, czy diffpolecenia. W logprzypadku znajduje się w man git-rev-parsedokumentacji:
Aby wykluczyć zatwierdzenia osiągalne z zatwierdzenia, używana jest notacja z prefiksem ^. Np. ^ R1 r2 oznacza zatwierdzenia osiągalne z r2, ale wyklucza te osiągalne z r1.
Ta operacja zestawu pojawia się tak często, że istnieje na nią skrót. Gdy masz dwa zatwierdzenia r1 i r2 (nazwane zgodnie ze składnią wyjaśnioną w OKREŚLANIU ZMIAN powyżej), możesz poprosić o zatwierdzenia, które są osiągalne z r2, z wyłączeniem tych, które są osiągalne z r1 przez „^ r1 r2” i można je zapisać jako „r1..r2”.
Podobny zapis „r1 ... r2” nazywa się różnicą symetryczną r1 i r2 i definiuje się go jako „r1 r2 - nie $ (git merge-base --all r1 r2)”. Jest to zestaw zatwierdzeń, które są osiągalne z jednego z r1 lub r2, ale nie z obu.
Co w zasadzie oznacza, że otrzymasz wszystkie zatwierdzenia, które znajdują się w jednej z dwóch gałęzi, ale nie w obu.
W diffprzypadku znajduje się w man git-diffdokumentacji:
git diff [--options] <commit>...<commit> [--] [<path>...]
This form is to view the changes on the branch containing and up to
the second <commit>, starting at a common ancestor of both
<commit>. "git diff A...B" is equivalent to "git diff
$(git-merge-base A B) B". You can omit any one of <commit>, which
has the same effect as using HEAD instead.
Co jest trochę rozmyte. Zasadniczo oznacza to, że pokazuje tylko różnice w tej gałęzi w porównaniu do innej gałęzi: szuka ostatniego wspólnego zatwierdzenia z pierwszym zleceniem, które mu dałeś, a następnie różnicuje drugie zobowiązanie do tego. Jest to łatwy sposób, aby zobaczyć, jakie zmiany są wprowadzane w tej gałęzi, w porównaniu do tej gałęzi, bez zwracania uwagi na zmiany tylko w tej gałęzi.
Jest ..to nieco prostsze: w tym git-diffprzypadku jest to to samo, co A git diff A Bi różni się A od B. W logprzypadku pokazuje wszystkie zatwierdzenia, które są w B, ale nie w A.
To dość śmieszne, jak sens ..i ...jest dokładnie zamienione na dzienniku i Diff: log A..Bto zmienia się z podstawy seryjnej do B, która jest, co diff A...Brobi
phiresky
1
@phiresky Tak, to naprawdę słaba użyteczność. Zalecam, aby nie używać notacji kropkowych git diff.
wisbucky
2
Czy to oznacza A...B== A..B + B..A?
Danon
2
@Danon za git logto jest absolutnie tak
maoizm
659
Używanie zakresów zatwierdzania z Git Log
Kiedy używasz zakresów zatwierdzania jak ..i ...z git log, różnica między nimi jest taka, że dla gałęzi A i B
git log A..B
pokaże ci wszystkie zobowiązania, które ma B, których A nie ma , póki
git log A...B
pokaże oba zatwierdzenia, które A ma i których B nie ma, i zobowiązania, które B ma, że A nie ma, lub innymi słowy, odfiltruje wszystkie zatwierdzenia, które dzielą zarówno A, jak i B, tym samym pokazując tylko zatwierdzenia, których oba nie dzielą .
Wizualizacja za pomocą diagramów Venna i drzew zatwierdzeń
Oto wizualna reprezentacja git log A..B. Zatwierdzenia, które zawiera gałąź B, które nie istnieją w A, są zwracane przez zakres zatwierdzania i są podświetlone na czerwono na diagramie Venna i zakreślone na niebiesko w drzewie zatwierdzeń:
To są diagramy dla git log A...B. Zauważ, że commity, które są wspólne dla obu gałęzi, nie są zwracane przez polecenie:
Zwiększenie ...użyteczności potrójnego zakresu zatwierdzania
Możesz uczynić zakres zatwierdzania potrójną kropką ...bardziej przydatnym w poleceniu log, używając --left-rightopcji pokazującej, które zatwierdzenia należą do której gałęzi:
W powyższych wynikach zobaczysz, że zatwierdzenia, które należą, mastersą poprzedzone znakiem <, a zatwierdzenia, które należą, origin/mastersą poprzedzone znakiem >.
Ta odpowiedź wyjaśnia różnicę za pomocą zwięzłego tekstu, przykładów i zdjęć. Podoba mi się to znacznie lepiej niż obecnie głosowana odpowiedź, która cytuje niejasną dokumentację. (tl; dr dzięki tej odpowiedzi faktycznie rozumiem różnicę).
aerique
4
@Ciastko, czy możesz dodać znaczenie off ... w git diff?
Marius
1
@Marius, teraz, kiedy to poruszasz, przejdę do odnośnika do tego pytania w mojej odpowiedzi dla przyszłych czytelników takich jak ty.
2
Czy to nie jest wręcz przeciwnie? dig diff a..b to WSZYSTKIE diff, lub w zasadzie to samo co git diff a b. Podczas gdy git dif a ... b jest TYLKO zmianami b dokonanymi od czasu rozgałęzienia od a.
Odpowiedzi:
Zależy to od tego, czy używasz
log
polecenia, czydiff
polecenia. Wlog
przypadku znajduje się wman git-rev-parse
dokumentacji:Co w zasadzie oznacza, że otrzymasz wszystkie zatwierdzenia, które znajdują się w jednej z dwóch gałęzi, ale nie w obu.
W
diff
przypadku znajduje się wman git-diff
dokumentacji:Co jest trochę rozmyte. Zasadniczo oznacza to, że pokazuje tylko różnice w tej gałęzi w porównaniu do innej gałęzi: szuka ostatniego wspólnego zatwierdzenia z pierwszym zleceniem, które mu dałeś, a następnie różnicuje drugie zobowiązanie do tego. Jest to łatwy sposób, aby zobaczyć, jakie zmiany są wprowadzane w tej gałęzi, w porównaniu do tej gałęzi, bez zwracania uwagi na zmiany tylko w tej gałęzi.
Jest
..
to nieco prostsze: w tymgit-diff
przypadku jest to to samo, co Agit diff A B
i różni się A od B. Wlog
przypadku pokazuje wszystkie zatwierdzenia, które są w B, ale nie w A.źródło
..
i...
jest dokładnie zamienione na dzienniku i Diff:log A..B
to zmienia się z podstawy seryjnej do B, która jest, codiff A...B
robigit diff
.A...B
==A..B + B..A
?git log
to jest absolutnie takUżywanie zakresów zatwierdzania z Git Log
Kiedy używasz zakresów zatwierdzania jak
..
i...
zgit log
, różnica między nimi jest taka, że dla gałęzi A i Bpokaże ci wszystkie zobowiązania, które ma B, których A nie ma , póki
pokaże oba zatwierdzenia, które A ma i których B nie ma, i zobowiązania, które B ma, że A nie ma, lub innymi słowy, odfiltruje wszystkie zatwierdzenia, które dzielą zarówno A, jak i B, tym samym pokazując tylko zatwierdzenia, których oba nie dzielą .
Wizualizacja za pomocą diagramów Venna i drzew zatwierdzeń
Oto wizualna reprezentacja
git log A..B
. Zatwierdzenia, które zawiera gałąź B, które nie istnieją w A, są zwracane przez zakres zatwierdzania i są podświetlone na czerwono na diagramie Venna i zakreślone na niebiesko w drzewie zatwierdzeń:To są diagramy dla
git log A...B
. Zauważ, że commity, które są wspólne dla obu gałęzi, nie są zwracane przez polecenie:Zwiększenie
...
użyteczności potrójnego zakresu zatwierdzaniaMożesz uczynić zakres zatwierdzania potrójną kropką
...
bardziej przydatnym w poleceniu log, używając--left-right
opcji pokazującej, które zatwierdzenia należą do której gałęzi:W powyższych wynikach zobaczysz, że zatwierdzenia, które należą,
master
są poprzedzone znakiem<
, a zatwierdzenia, które należą,origin/master
są poprzedzone znakiem>
.Używanie zakresów zatwierdzania z Git Diff
Któregoś dnia mogę dodać własne wyjaśnienie, jak działają zakresy zatwierdzeń
git diff
, ale na razie warto sprawdzić, jakie są różnice między podwójną kropką „..” a potrójną kropką „...” w Git diff commit zakresy? .Zobacz też
źródło