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 log
comando o un diff
comando. Nel log
caso, è nella man git-rev-parse
documentazione:
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 diff
caso, è nella man git-diff
documentazione:
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-diff
caso, è lo stesso di una git diff A B
e solo diff A contro B. Nel log
caso, mostra tutti i commit che sono in B, ma non in A.
..
ed ...
è esattamente scambiato con log e diff: log A..B
sono i cambiamenti dalla base di unione a B che è ciò che diff A...B
fa
git diff
.
A...B
== A..B + B..A
?
git log
questo è 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-right
opzione 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 master
prefisso con i prefissi <
, mentre i origin/master
prefissi 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? .