Quali sono le differenze tra il punto doppio “..” e il punto triplo “…” in Git diff commit range?

Quali sono le differenze tra i seguenti comandi ?:

git diff foo master # a git diff foo..master # b git diff foo...master # c 

Il manuale diff parla su di esso:

Confronto di rami

 $ git diff topic master  $ git diff topic..master  $ git diff topic...master  
  1. Cambiamenti tra i suggerimenti dell’argomento e i rami master.
  2. Come sopra.
  3. Modifiche avvenute sul ramo principale da quando è stato avviato il ramo dell’argomento.

ma non è completamente chiaro per me.

Poiché avevo già creato queste immagini, ho pensato che valesse la pena utilizzarle in un’altra risposta, sebbene la descrizione della differenza tra .. (punto-punto) e ... (punto-punto-punto) sia essenzialmente la stessa come nella risposta di Manojlds .

Il comando git diff mostra solo la differenza tra gli stati dell’albero tra esattamente due punti nel grafico di commit. Le .. e ... notazioni in git diff hanno i seguenti significati:

Un'illustrazione dei diversi modi di specificare i commit per git diff

In altre parole, git diff foo..bar è esattamente uguale a git diff foo bar ; entrambi ti mostreranno la differenza tra le punte dei due rami foo e bar . D’altra parte, git diff foo...bar ti mostrerà la differenza tra la “base di fusione” dei due rami e la punta della bar . La “merge base” è di solito l’ultimo commit in comune tra questi due rami, quindi questo comando ti mostrerà le modifiche che il tuo lavoro sulla bar ha introdotto, ignorando tutto ciò che è stato fatto su foo nel frattempo.

Questo è tutto ciò che devi sapere sulle .. e ... notazioni in git diff . Però…


… una fonte comune di confusione qui è che .. e ... significano cose sottilmente diverse quando usate in un comando come git log che si aspetta un insieme di commit come uno o più argomenti. (Questi comandi finiscono tutti usando git rev-list per analizzare un elenco di commit dai loro argomenti.)

Il significato di .. e ... per git log può essere mostrato graficamente come segue:

Un'illustrazione dei diversi modi di specificare intervalli di commit per git log

Quindi, git rev-list foo..bar ti mostra tutto sulla bar diramazione che non si trova anche sul ramo foo . D’altra parte, git rev-list foo...bar mostra tutti i commit che si trovano sia in foo che in bar , ma non in entrambi . Il terzo diagramma mostra solo che se si elencano i due rami, si ottengono i commit che sono in uno o entrambi.

Bene, trovo che tutto sia un po ‘confuso, comunque, e penso che i diagrammi del diagramma di commit aiutino 🙂

¹ Dico solo “in genere” poiché quando risolvo i conflitti di unione, ad esempio, git diff ti mostrerà un’unione a tre.

git diff foo master Diff tra i comandi in alto (testa) di foo e master.

git diff foo..master Un altro modo di fare la stessa cosa.

git diff foo...master Diff dal comune antenato ( git merge-base foo master ) di foo e master to tip of master. In altre parole, mostra solo le modifiche introdotte dal ramo principale dal suo antenato comune con foo.

Questo esempio di GitHub spiega quando utilizzare i due:

Ad esempio, se crei un ramo “dev” e aggiungi una funzione a un file, torna al tuo ramo “master” e rimuovi una riga dal README, quindi esegui qualcosa come questo:

 $ git diff master dev 

Ti dirà che una funzione è stata aggiunta dal primo file e una riga è stata aggiunta al README. Perché? Perché sul ramo, il README ha ancora la linea originale, ma su “master” lo hai rimosso – quindi il confronto diretto con le istantanee sembra “dev” lo ha aggiunto.

Quello che vuoi veramente confrontare è quanto è cambiato “dev” da quando i tuoi rami si sono separati. Per farlo, Git ha una bella stenografia:

 $ git diff master...dev 

La mia versione consolidata del .. vs con diff vs log

Diff vs Log & .. vs ..

 git diff foo master 

mostrerà le differenze tra l’argomento e il ramo principale in quel momento

 git diff foo..master 

questo mostrerà anche le differenze tra l’argomento e il ramo principale in quel momento

 git diff foo...master 

questo mostrerà tutte le differenze tra quando l’argomento è stato creato dal ramo e dopo

quindi i primi 2 comandi sono gli stessi e l’ultimo mostra semplicemente una vista più ampia nella cronologia delle differenze