Comment trouver l'ancêtre commun le plus récent de deux branches Git?
Comment trouver l'ancêtre commun le plus récent de deux branches Git?
Réponses:
Vous recherchez git merge-base
. Usage:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopus
drapeau pour obtenir le bon résultat. L'évident mais le faux git merge-base branch1 branch2 branch3
vous donnera un commit, mais, comme décrit dans la section Discussion dans la documentation, ce n'est pas nécessairement un ancêtre commun des trois branches.
git diff master...feature
affiche toutes les nouvelles validations de votre branche de fonctionnalité actuelle (éventuellement multi-validation).
man git-diff
documents qui:
git diff A...B
est le même que:
git diff $(git merge-base A B) B
mais il ...
est plus facile à taper et à mémoriser.
Comme mentionné par Dave , le cas particulier de HEAD
peut être omis. Donc:
git diff master...HEAD
est le même que:
git diff master...
ce qui est suffisant si la branche courante l'est feature
.
Enfin, n'oubliez pas que l'ordre est important! Faire git diff feature...master
affichera les changements qui ne sont master
pas activés feature
.
Je souhaite que plus de commandes git prennent en charge cette syntaxe, mais je ne pense pas qu'elles le fassent. Et certains ont même une sémantique différente pour ...
: Quelles sont les différences entre les points doubles ".." et les points triple "..." dans les plages de validation Git?
git diff master...
dans le cas particulier de la différenceHEAD
git diff origin/branchname...
Comme indiqué dans une réponse précédente, git merge-base
fonctionne:
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
mais si myfeature
c'est la branche courante, comme cela est courant, vous pouvez utiliser use--fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Cet argument ne fonctionne que dans les versions suffisamment récentes de git. Malheureusement, cela ne fonctionne pas toujours, cependant, et on ne sait pas pourquoi. Veuillez vous référer aux limitations notées vers la fin de cette réponse .
Pour des informations complètes sur la validation, considérez:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
. L'exécution git merge-base --fork-point branch2
avec une branche (avec ses propres validations) que je sais avoir bifurquée à partir de la branche actuelle ne donne aucun résultat, alors qu'elle git merge-base branch1 branch2
montre correctement le point de bifurcation. Quel pourrait être le problème?
branch2
, puis exécutez git merge-base --fork-point branch1
.
gitk
, etc. pour voir à quoi ressemble l'arborescence. Vous obtiendrez peut-être votre réponse.
git merge-base branch1 branch2
. Mais ce qui est étrange, c'est que cela --fork-point
ne donne rien de toute façon. Avez-vous confirmé que cela fonctionne pour vous comme prévu?
Avec gitk
vous pouvez visualiser graphiquement les deux branches:
gitk branch1 branch2
Et puis il est facile de retrouver l'ancêtre commun dans l'histoire des deux branches.