Alcuni comandi Git accettano intervalli di commit e una sintassi valida è quella di separare due nomi di commit con due punti ..e un'altra sintassi utilizza tre punti ....
Quali sono le differenze tra i due?
Alcuni comandi Git accettano intervalli di commit e una sintassi valida è quella di separare due nomi di commit con due punti ..e un'altra sintassi utilizza tre punti ....
Quali sono le differenze tra i due?
Risposte:
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.
..ed ...è esattamente scambiato con log e diff: log A..Bsono i cambiamenti dalla base di unione a B che è ciò che diff A...Bfa
git diff.
A...B== A..B + B..A?
git logquesto è assolutamente sì
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 .
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:


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


...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 >.
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? .