Aké sú rozdiely medzi nasledujúcimi príkazmi ?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
Príručka diff hovorí o tom:
Porovnávanie odvetví
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- Zmeny medzi tipmi témy a hlavnými vetvami.
- Rovnaké ako vyššie.
- Zmeny, ktoré sa vyskytli na hlavnej vetve od jej spustenia.
ale nie je mi úplne jasné.
odpovede:
226 pre odpoveď č. 1Keďže som tieto obrázky už vytvoril, myslel som si, že by bolo užitočné ich použiť v inej odpovedi, hoci opis rozdielu medzi nimi ..
(dot-dot) a ...
(dot-dot-dot) je v podstate rovnaká ako v bode manojldsova odpoveď.
Príkaz git diff
typicky¹ iba ukazuje rozdiel medzi stavmi stromu medzi presne dvoma bodmi v grafe potvrdenia. ..
a ...
zápisy v git diff
majú nasledujúci význam:
Inými slovami, git diff foo..bar
je presne to isté ako git diff foo bar
; obidve vám ukážu rozdiel medzi koncami oboch vetiev foo
a bar
, Na druhej strane, git diff foo...bar
vám ukáže rozdiel medzi „zlúčenou základňou“ oboch vetiev a špičkou bar
, „Zlučovacia základňa“ je zvyčajne posledným spoločným záväzkom medzi týmito dvoma vetvami, takže tento príkaz vám ukáže zmeny, na ktorých pracujete. bar
uviedla, pričom ignoruje všetko, čo sa stalo foo
medzitým.
To je všetko, čo potrebujete vedieť o ..
a ...
zápisy v git diff
, Avšak ...
... tu je častým zdrojom zmätku ..
a ...
znamenajú jemne odlišné veci, keď sa používajú v príkaze, ako napríklad git log
ktorý očakáva súbor záväzkov ako jeden alebo viac argumentov. (Všetky tieto príkazy nakoniec skončia pomocou git rev-list
analyzovať zoznam záväzkov z ich argumentov.)
Význam ..
a ...
pre git log
graficky znázornené nižšie:
takže, git rev-list foo..bar
ukazuje všetko na vetve bar
to tiež nie je na vetve foo
, Na druhej strane, git rev-list foo...bar
ukáže všetky záväzky, ktoré sú v oboch foo
alebo bar
, ale nie oboje, Tretí obrázok len ukazuje, že ak uvediete zoznam dvoch vetiev, dostanete potvrdenia, ktoré sú v jednej alebo oboch z nich.
No, zistil som, že všetko trochu mätúce, tak ako tak, a myslím, že grafy diagramu odovzdania pomoci :)
¹ Hovorím iba „zvyčajne“, pretože pri riešení zlúčených konfliktov napríklad git diff
vám ukáže trojcestné zlúčenie.
22 pre odpoveď č. 2
git diff foo master
Rozdiel medzi hornými (hlavami) previneniami foo a master.
git diff foo..master
Ďalším spôsobom, ako urobiť to isté.
git diff foo...master
Líši sa od spoločného predka (git merge-base foo master
) foo a master na špičku master. Inými slovami, ukazuje iba zmeny, ktoré nadradená vetva zaviedla od svojho spoločného predka s foo.
V tomto príklade od spoločnosti GitHub vysvetľuje, kedy použiť tieto dve možnosti:
Napríklad, ak vytvoríte vetvu „dev“ a do funkcie pridáte funkciu súbor, potom sa vráťte do hlavnej vetvy a odstráňte riadok z PREČÍTAJTE a potom spustite niečo také:
$ git diff master dev
To vám povie, že funkcia bola pridaná odprvý súbor a riadok bol pridaný do README. Prečo? Pretože na vetve je README stále má pôvodný riadok, ale na „master“ ste ho odstránili - tak priame porovnanie snímok vyzerá ako „dev“.
To, čo skutočne chcete porovnať, je to, čo sa od začiatku zmenilo pobočky sa rozchádzali. Na to má Git peknú krátku skratku:
$ git diff master...dev
19 pre odpoveď č. 3
Moja konsolidovaná verzia .. proti ... s diff proti záznam
6 pre odpoveď č. 4
git diff foo master
zobrazí rozdiely medzi témou a hlavnou vetvou v danom okamihu
git diff foo..master
to tiež ukáže rozdiely medzi témou a hlavnou vetvou v danom časovom okamihu
git diff foo...master
to ukáže všetky rozdiely medzi tým, kedy bola téma vytvorená z vetvy a po nej
takže prvé dva príkazy sú rovnaké a posledný iba zobrazuje širší pohľad v histórii diferenci