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
--octopusbandiera per ottenere il risultato giusto. L'ovvio ma sbagliato git merge-base branch1 branch2 branch3ti 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 HEADpuò 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...masterverranno visualizzate le modifiche che non sono masterattive 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-basefunziona:
$ 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 branch2con un ramo (con i propri commit) che so che ha biforcuto dal ramo corrente non produce alcun risultato, mentre git merge-base branch1 branch2mostra correttamente il punto di fork. Quale potrebbe essere il problema?
branch2ed 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-pointnon dà nulla in entrambi i modi. Hai confermato che funziona per te come previsto?
Con gitkpuoi visualizzare graficamente i due rami:
gitk branch1 branch2
E poi è facile trovare l'antenato comune nella storia dei due rami.