2011-08-31 8 views
121

Quali sono le differenze tra i seguenti comandi ?:Quali sono le differenze tra il punto doppio ".." e il punto triplo "..." in Git diff commit range?

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

The diff manual ne parla:

Confrontando i rami

$ git diff topic master <1> 
$ git diff topic..master <2> 
$ git diff topic...master <3> 
  1. Cambiamenti tra le punte del tema e la rami principali
  2. Come sopra.
  3. Modifiche avvenute sul ramo master da quando è stato avviato il ramo dell'argomento.

ma non è completamente chiaro per me.

+0

Mentre la questione non è un duplicato, [questa risposta] (http://stackoverflow.com/questions/5256249/git-diff-doesnt-show -enough/5257065 # 5257065) mostra graficamente il significato di '..' e' ... 'in' git diff' e i loro diversi significati in 'git log'. –

+2

possibile duplicato di [Quali sono le differenze tra doppio punto ".." e punto triplo "..." in Git commit ranges?] (Http://stackoverflow.com/questions/462974/what-are-the -differences-between-double-dot-and-triple-dot-in-git-com) – chharvey

risposta

206

Dal momento che avevo già creato queste immagini, ho pensato che potrebbe valere la pena di utilizzarli in un'altra risposta, anche se la descrizione della differenza tra .. (punto-punto) e ... (punto-punto-punto) è essenzialmente uguale a manojlds's answer.

Il comando git diff in genere¹ mostra solo la differenza tra gli stati dell'albero tra esattamente due punti nel grafico di commit. I .. e ... iscrizioni nel git diff hanno i seguenti significati:

An illustration of the different ways of specifying commits for git diff

In altre parole, git diff foo..bar è esattamente lo stesso come 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 mostrerà la differenza tra la "base di unione" dei due rami e la punta di bar. La "merge base" è solitamente l'ultimo commit in comune tra questi due rami, quindi questo comando mostrerà le modifiche apportate al lavoro su bar, ignorando tutto ciò che è stato fatto su foo nel frattempo.

Questo è tutto ciò che devi sapere sulle note .. e ... in git diff. Tuttavia ...


... una fonte comune di confusione è che .. e ... significa cose leggermente diverse quando viene utilizzato in un comando come git log che prevede una serie di commit come uno o più argomenti. (. Questi comandi tutti finiscono con git rev-list per analizzare un elenco di commit da loro argomenti)

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

An illustration of the different ways of specifying ranges of commits for git log

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

Beh, trovo che tutti un po 'di confusione, in ogni caso, e credo che il commettere diagrammi grafico aiuto :)

¹ dico solo "tipicamente" da quando la risoluzione dei conflitti unire, per esempio, git diff vi mostrerà un'unione a tre vie.

+1

Mi piacciono i tuoi diagrammi. [Sono arrivato anche io poco fa] (http://stackoverflow.com/a/24186641/456814). Ho alcune idee per i miei diagrammi 'git diff' che farò in seguito. –

+13

Qualcuno ha notato? Gli effetti di '..' e' ... 'senti _reversato_ in' git diff' (rispetto a 'git rev-list')! –

+1

Mi hai avuto a "Questo è tutto ciò che devi sapere [...]. Tuttavia ...". :-) Git è pieno di cose come questa dove notazione e terminologia simili significano cose diverse in contesti diversi; grazie per aver chiarito questo così bene – ShreevatsaR

6
git diff foo master 

mostrerà le differenze tra l'argomento e branch master in quel punto nel tempo

git diff foo..master 

Questo mostrerà anche le differenze fra il tema e il ramo master in quel momento

git diff foo...master 

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

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

20

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 da comune antenato (git merge-base foo master) di foo e master a tip of master. In altre parole, mostra solo le modifiche introdotte dal ramo principale dal suo antenato comune con il master.

This example da GitHub spiega quando utilizzare i due:

Per esempio, se si crea un ramo 'dev' e aggiunge una funzione in un file , poi tornare al ramo 'master' e rimuovere una linea dal README, e quindi eseguire qualcosa di simile:

$ git diff master dev 

vi dirà che una funzione è stata aggiunta dal primo file e una linea è stato inserito il file README. Perché? Perché sul ramo, il README ha ancora la linea originale, ma su "master" lo hai rimosso - quindi confrontando direttamente le istantanee sembra "dev" l'ha aggiunto.

Ciò che si desidera confrontare è ciò che "dev" è cambiato da quando i rami sono stati divergenti.Per fare questo, Git ha un bel po 'di stenografia:

$ git diff master...dev 
+2

git diff foo ... master modifiche che il ramo principale ha introdotto dal suo antenato comune con foo – 0fnt

+0

@manojlds ok, domanda così diversa , se sei su un ramo dev e commetti le tue modifiche (la funzione) e fai le modifiche in un ramo dev remoto significa che il cambiamento visibile è solo la funzione o la funzione e il readme? – David

+0

@ 0fnt è corretto. Ho sistemato. –

11

La mia versione consolidata di .. vs ... con diff vs registro

Diff vs Log & .. vs ..

+0

questo sarebbe molto buono, se solo non avesse così tanti colori diversi e le operazioni di set mescolate insieme con '..' /' ... 'roba. Ad esempio in 'log A ... B' non è chiaro se il comando restituisce l'intersezione (parte bianca del diagramma) o il resto dell'unione A-B (verde). Sarebbe più al punto senza gli operandi impostati e con solo 1 colore. – xealits

Problemi correlati