Come trovare l’antenato più recente di due rami Git?

Come trovare l’antenato più recente di due rami Git?

Stai cercando git merge-base . Uso:

 $ git merge-base branch2 branch3 050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

git diff master...feature

mostra tutti i nuovi commit del tuo ramo di funzione corrente (possibilmente multi-commit).

man git-diff documenta che:

 git diff A...B 

equivale a:

 git diff $(git merge-base AB) B 

ma il ... è 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 attuale è una feature .

Infine, ricorda che l’ordine conta! Facendo git diff feature...master mostrerà le modifiche che si trovano sul master non sulla feature .

Vorrei che più comandi Git supportassero quella syntax, ma non credo che lo facciano. E alcuni hanno anche semantica diversa per ... : quali sono le differenze tra il punto doppio “..” e il punto triplo “…” nelle gamme di commit Git?

Come notato 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 in versioni sufficientemente recenti di git. Sfortunatamente non sempre funziona, tuttavia, e non è chiaro perché. Si prega di fare riferimento alle limitazioni annotate verso la fine di questa risposta .


Per informazioni complete sul commit, considera:

 $ git log -1 $(git merge-base --fork-point develop) 

Con gitk puoi visualizzare graficamente i due rami:

 gitk branch1 branch2 

E poi è facile trovare l’antenato comune nella storia dei due rami.

Una volta acquisito, il comune antenato SHA può essere utilizzato, ad esempio, per visualizzare i commit disponibili sul telecomando, in questo modo:

 #!/bin/bash git remote update REMBR=`git show-remote-branch` REMHEAD=`git rev-parse $REMBR` MERGEBASE=`git merge-base HEAD $REMBR` REMURL=`git config remote.origin.url` git request-pull $MERGEBASE $REMURL $REMHEAD