¿Cómo encontrar el ancestro común más reciente de dos ramas Git?
¿Cómo encontrar el ancestro común más reciente de dos ramas Git?
Respuestas:
Que busca git merge-base
. Uso:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopus
bandera para obtener el resultado correcto. Lo obvio pero incorrecto git merge-base branch1 branch2 branch3
le dará una confirmación, pero, como se describe en la sección Discusión en los documentos, no es necesariamente un antepasado común de las tres ramas.
git diff master...feature
muestra todas las nuevas confirmaciones de su rama de característica actual (posiblemente de confirmación múltiple).
man git-diff
documentos que:
git diff A...B
es lo mismo que:
git diff $(git merge-base A B) B
pero ...
es más fácil de escribir y recordar.
Como lo mencionó Dave , HEAD
se puede omitir el caso especial de . Entonces:
git diff master...HEAD
es lo mismo que:
git diff master...
que es suficiente si la rama actual es feature
.
Finalmente, recuerda que el orden importa! Hacer git diff feature...master
mostrará cambios que no están master
activados feature
.
Deseo que más comandos git admitan esa sintaxis, pero no creo que lo hagan. Y algunos incluso tienen una semántica diferente para ...
: ¿Cuáles son las diferencias entre doble punto "..." y triple punto "..." en los rangos de confirmación de Git?
git diff master...
en el caso especial de diferir aHEAD
git diff origin/branchname...
Como se señaló en una respuesta anterior, git merge-base
funciona:
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
pero si myfeature
es la rama actual, como es común, puede usar use --fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Este argumento solo funciona en versiones suficientemente recientes de git. Desafortunadamente, no siempre funciona, y no está claro por qué. Consulte las limitaciones observadas al final de esta respuesta .
Para obtener información de confirmación completa, considere:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
. Ejecutar git merge-base --fork-point branch2
con una rama (con sus propios commits) que sé que se bifurcó desde la rama actual no produce ningún resultado, mientras que git merge-base branch1 branch2
muestra correctamente el punto de bifurcación. ¿Cual podría ser el problema?
branch2
y luego ejecutar git merge-base --fork-point branch1
.
gitk
, etc. para ver cómo se ve el árbol. Tal vez obtendrás tu respuesta.
git merge-base branch1 branch2
. Pero lo extraño es que --fork-point
no da nada de ninguna manera. ¿Ha confirmado que funciona para usted según lo previsto?
Con gitk
usted puede ver las dos ramas gráficamente:
gitk branch1 branch2
Y luego es fácil encontrar el antepasado común en la historia de las dos ramas.