Come trovare l'antenato comune più recente di due rami Git?
Come trovare l'antenato comune più recente di due rami Git?
Risposte:
Stai cercando git merge-base
. Uso:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopus
bandiera per ottenere il risultato giusto. L'ovvio ma sbagliato git merge-base branch1 branch2 branch3
ti darà un impegno, ma, come descritto nella sezione Discussione nei documenti, non è necessariamente un antenato comune di tutti e tre i rami.
git diff master...feature
mostra tutti i nuovi commit del ramo della funzione corrente (possibilmente multi-commit).
man git-diff
documenti che:
git diff A...B
equivale a:
git diff $(git merge-base A B) B
ma ...
è più facile da scrivere e ricordare.
Come menzionato da Dave , il caso speciale di HEAD
può essere omesso. Così:
git diff master...HEAD
equivale a:
git diff master...
che è sufficiente se il ramo corrente è feature
.
Infine, ricorda che l'ordine conta! In questo modo git diff feature...master
verranno visualizzate le modifiche che non sono master
attive feature
.
Vorrei che più comandi git supportassero quella sintassi, ma non credo che lo facciano. E alcuni hanno anche una semantica diversa per ...
: quali sono le differenze tra il punto doppio ".." e il punto triplo "..." negli intervalli di commit di Git?
git diff master...
nel caso speciale di diffing toHEAD
git diff origin/branchname...
Come indicato in una risposta precedente, git merge-base
funziona:
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
ma se myfeature
è il ramo corrente, come è comune, puoi usare use --fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Questo argomento funziona solo con versioni sufficientemente recenti di git. Purtroppo non sempre funziona, tuttavia, e non è chiaro il perché. Si prega di fare riferimento alle limitazioni annotate verso la fine di questa risposta .
Per informazioni complete sul commit, considerare:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
. Correre git merge-base --fork-point branch2
con un ramo (con i propri commit) che so che ha biforcuto dal ramo corrente non produce alcun risultato, mentre git merge-base branch1 branch2
mostra correttamente il punto di fork. Quale potrebbe essere il problema?
branch2
ed esegui git merge-base --fork-point branch1
.
gitk
. Ecc. Per vedere come appare l'albero. Forse otterrai la tua risposta.
git merge-base branch1 branch2
. Ma la cosa strana è che --fork-point
non dà nulla in entrambi i modi. Hai confermato che funziona per te come previsto?
Con gitk
puoi visualizzare graficamente i due rami:
gitk branch1 branch2
E poi è facile trovare l'antenato comune nella storia dei due rami.