Quali sono le differenze tra il punto doppio “..” e il punto triplo “…” nelle gamme di commit Git?

Alcuni comandi Git accettano intervalli di commit e una syntax valida è quella di separare due nomi di commit con due punti .. , e un’altra syntax usa tre punti ...

Quali sono le differenze tra i due?

Dipende se stai usando un comando di log o un comando diff . Nel caso del log , è nella documentazione man git-rev-parse :

Per escludere i commit raggiungibili da un commit, viene utilizzato un prefisso ^ notazione. Ad esempio ^ r1 r2 significa commit raggiungibile da r2 ma esclude quelli raggiungibili da r1.

Questa operazione impostata appare così spesso che esiste una scorciatoia per questo. Quando hai due commit r1 e r2 (chiamati secondo la syntax spiegata in SPECIFICARE LE REVISIONI sopra), puoi chiedere commit che sono raggiungibili da r2 escludendo quelli che sono raggiungibili da r1 per “^ r1 r2” e può essere scritto come “r1..r2”.

Una notazione simile “r1 … r2” è chiamata differenza simmetrica di r1 e r2 ed è definita come “r1 r2 –not $ (git merge-base –all r1 r2)”. È l’insieme di commit raggiungibili da uno di r1 o r2 ma non da entrambi.

Il che significa che otterrai tutti i commit che si trovano in uno dei due rami, ma non in entrambi.

Nel caso diff , è nella documentazione man git-diff :

  git diff [--options] ... [--] [...] This form is to view the changes on the branch containing and up to the second , starting at a common ancestor of both . "git diff A...B" is equivalent to "git diff $(git-merge-base AB) B". You can omit any one of , which has the same effect as using HEAD instead. 

Che è un po ‘confuso. Fondamentalmente significa che mostra solo le differenze in quel ramo rispetto ad un altro ramo: cerca l’ultimo commit comune con il primo commit che gli hai dato, e poi diff secondo il secondo commit a quello. È un modo semplice per vedere quali modifiche vengono apportate in quel ramo, rispetto a questo ramo, senza prendere in considerazione le modifiche solo in questo ramo.

Il .. è un po ‘più semplice: nel caso git-diff , è lo stesso di un git diff AB e differisce A contro B. Nel caso log , mostra tutti i commit che sono in B ma non in A.

Utilizzando Commit Ranges con Git Log

Quando usi intervalli di commit come .. e ... con git log , la differenza tra loro è che, per i rami A e B,

 git log A..B 

ti mostrerà tutti i commit che B ha che A non ha , mentre

 git log A...B 

mostrerà entrambi i commit che A ha e che B non ha, e il commit che B ha che A non ha, o in altre parole, filtrerà tutti i commit che sia A che B condividono, quindi mostra solo i commit che non condividono entrambi .

Visualizzazione con Venn Diagrams & Commit Trees

Ecco una rappresentazione visuale di git log A..B . Il commit che il ramo B contiene che non esistono in A è ciò che viene restituito dall’intervallo di commit ed è evidenziato in rosso nel diagramma di Venn e cerchiato in blu nell’albero di commit:

diagramma Albero 1

Questi sono i diagrammi per git log A...B Si noti che i commit condivisi da entrambi i rami non vengono restituiti dal comando:

diagramma Albero 2

Rendere la gamma di comandi a tre punti ... Più utile

Puoi --left-right l’intervallo di commit a tre punti ... più utile in un comando di registro utilizzando l’opzione --left-right per mostrare quali commit appartengono a quale ramo:

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

Nell’output precedente, vedrai che i commit che appartengono al master hanno il prefisso < , mentre i commit che appartengono a origin/master sono preceduti da > .

Utilizzando Commit Ranges con Git Diff

Un giorno potrei aggiungere la mia spiegazione su come funzionano le gamme di commit con git diff , ma per ora potresti voler controllare quali sono le differenze tra "punto doppio" e "punto triplo" ... in Git gamme di commit diff? .

Guarda anche

  • Pro Git § 6.1 Git Tools - Revision Selection - Commit Ranges