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 ...
.
Jakie są różnice między nimi?
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 ...
.
Jakie są różnice między nimi?
Odpowiedzi:
Zależy to od tego, czy używasz log
polecenia, czy diff
polecenia. W log
przypadku znajduje się w man git-rev-parse
dokumentacji:
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 diff
przypadku znajduje się w man git-diff
dokumentacji:
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-diff
przypadku jest to to samo, co A git diff A B
i różni się A od B. W log
przypadku pokazuje wszystkie zatwierdzenia, które są w B, ale nie w A.
..
i ...
jest dokładnie zamienione na dzienniku i Diff: log A..B
to zmienia się z podstawy seryjnej do B, która jest, co diff A...B
robi
git diff
.
A...B
== A..B + B..A
?
git log
to jest absolutnie tak
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ą .
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:
...
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:
$ 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żą, master
są poprzedzone znakiem <
, a zatwierdzenia, które należą, origin/master
są poprzedzone znakiem >
.
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? .