¿Cómo encontrar el ancestro común más reciente de dos twigs de Git?

¿Cómo encontrar el ancestro común más reciente de dos twigs de Git?

Usted está buscando git merge-base . Uso:

 $ git merge-base branch2 branch3 050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

git diff master...feature

muestra todas las nuevas confirmaciones de su twig de función actual (posiblemente multi-commit).

man git-diff documentos que:

 git diff A...B 

es lo mismo que:

 git diff $(git merge-base AB) B 

pero el ... es más fácil de escribir y recordar.

Como mencionó Dave , el caso especial de HEAD se puede omitir. Asi que:

 git diff master...HEAD 

es lo mismo que:

 git diff master... 

que es suficiente si la twig actual es feature .

¡Finalmente, recuerda que el orden importa! Haciendo la función de git diff feature...master mostrará los cambios que están en la función master no feature .

Deseo que más comandos de git admitan esa syntax, pero no creo que lo hagan. Y algunos incluso tienen una semántica diferente para ... : ¿Cuáles son las diferencias entre los puntos dobles “..” y los puntos triples “…” en los intervalos de compromiso de Git?

Como se señaló en una respuesta anterior, git merge-base funciona:

 $ git merge-base myfeature develop 050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

pero si myfeature es la twig 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, sin embargo, y no está claro por qué. Por favor refiérase a las limitaciones anotadas al final de esta respuesta .


Para obtener información completa de compromiso, considere:

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

Con gitk puedes ver las dos twigs gráficamente:

 gitk branch1 branch2 

Y luego es fácil encontrar el ancestro común en la historia de las dos twigs.

Una vez adquirido, el ancestro SHA común se puede usar, por ejemplo, para ver los commits disponibles en el control remoto, de esta forma:

 #!/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