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


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


616
2017-10-10 21:43


origen


Respuestas:


Estás buscando git merge-base. Uso:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

730
2017-10-10 21:47



git diff master...feature

muestra todas las nuevas confirmaciones de su rama 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 A B) B

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

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

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! Obra git diff feature...master mostrará los cambios que están en master no en feature.

Deseo que más comandos de 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 el punto doble ".." y el punto triple "..." en los intervalos de compromiso de Git?


23
2017-07-18 12:39



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

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

pero si myfeature es la rama actual, como es común, puede usar el uso --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 hacia el final de esta respuesta.


Para obtener información completa de compromiso, considere:

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

12
2018-02-09 17:23



Con gitk puedes ver las dos ramas gráficamente:

gitk branch1 branch2

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


6
2018-02-08 17:52



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

-2
2017-07-09 20:38