Jakie są różnice między podwójnymi kropkami „..” i potrójnymi kropkami „…” w zakresach zatwierdzania Git?

Odpowiedzi:

251

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.

Pieter
źródło
31
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ń:

 Diagram „git log A..B”Drzewo 1

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:

 Schemat „git log A ... B”Drzewo 2

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:

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

W powyższych wynikach zobaczysz, że zatwierdzenia, które należą, mastersą poprzedzone znakiem <, a zatwierdzenia, które należą, origin/mastersą 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ż

Społeczność
źródło
35
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.
wejrowski
2
Przynajmniej dla git log. W przypadku git diff może coś jest odwrócone: stackoverflow.com/questions/7251477/...
Benjamin Atkin