Quali sono le differenze tra il punto doppio ".." e il punto triplo "..." negli intervalli di commit di Git?


Risposte:


251

Dipende se stai usando un logcomando o un diffcomando. Nel logcaso, è nella man git-rev-parsedocumentazione:

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 essa. Quando hai due commit r1 e r2 (nominati secondo la sintassi spiegata in SPECIFICHE REVISIONI sopra), puoi chiedere commit che sono raggiungibili da r2 escludendo quelli che sono raggiungibili da r1 da "^ 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 che sono raggiungibili da uno di r1 o r2 ma non da entrambi.

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

Nel diffcaso, è nella man git-diffdocumentazione:

  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.

Che è un po 'sfocato. Fondamentalmente significa che mostra solo le differenze in quel ramo rispetto a un altro ramo: cerca l'ultimo commit comune con il primo commit che gli hai dato, e quindi differisce il secondo commit a quello. È un modo semplice per vedere quali modifiche vengono apportate in quel ramo, rispetto a questo ramo, senza prendere atto delle modifiche solo in questo ramo.

Il ..è un po 'più semplice: Nel git-diffcaso, è lo stesso di una git diff A Be solo diff A contro B. Nel logcaso, mostra tutti i commit che sono in B, ma non in A.


31
È abbastanza ridicolo come il significato di ..ed ...è esattamente scambiato con log e diff: log A..Bsono i cambiamenti dalla base di unione a B che è ciò che diff A...Bfa
phiresky

1
@phiresky Sì, questa è un'usabilità davvero scarsa. Consiglio di non usare le notazioni punto per git diff.
Wisbucky,

2
Questo significa A...B== A..B + B..A?
Danon,

2
@Danon per git logquesto è assolutamente sì
maoizm il

659

Utilizzo di Commit Ranges con Git Log

Quando si utilizzano 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

ti mostrerà entrambi i commit che A ha e che B non ha, e i commit che B ha che A non ha, o in altre parole, filtrerà tutti i commit che entrambi A e B condividono, mostrando così solo i commit che entrambi non condividono .

Visualizzazione con Venn Diagrams & Commit Trees

Ecco una rappresentazione visiva di git log A..B. I 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 nella struttura di commit:

 diagramma "git log A..B"Albero 1

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

 diagramma "git log A ... B"Albero 2

Rendere ...più utile l' intervallo di commit a triplo punto

È possibile rendere l'intervallo di commit a triplo punto ...più utile in un comando di registro utilizzando l' --left-rightopzione 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 sopra, vedrai il masterprefisso con i prefissi <, mentre i origin/masterprefissi con il prefisso >.

Utilizzo di Commit Ranges con Git Diff

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

Guarda anche


35
Questa risposta in realtà spiega la differenza con un testo conciso, esempi e immagini. Mi piace molto meglio della risposta attualmente più votata che cita solo la documentazione poco chiara. (tl; dr grazie a questa risposta capisco davvero la differenza.)
aerique,

4
@Cupcake potresti aggiungere il significato ... in git diff?
Marius,

1
@Marius in realtà, ora che lo fai apparire, andrò avanti e collegherò a quell'altra domanda nella mia risposta, per i futuri lettori come te.

2
Non è davvero il contrario? dig diff a..b è ALL diffs, o sostanzialmente uguale a git diff a b. Considerando che git dif a ... b è SOLO le modifiche che b ha apportato dalla ramificazione da a.
wejrowski,

2
Almeno per git log. Per git diff forse le cose sono invertite: stackoverflow.com/questions/7251477/…
Benjamin Atkin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.