Probar commits que no son ancestros
En los pasos anteriores, usamos git merge-base --is-ancestor
para confirmar que los commits anteriores eran ancestros de los commits posteriores en la misma rama. Ahora, exploremos qué sucede cuando probamos commits que no son ancestros el uno del otro.
Navega al directorio de tu repositorio:
cd ~/project/git-ancestor-lab
Actualmente tenemos una sola rama (master
) con tres commits. Para probar relaciones de no-ascendencia, necesitamos crear una nueva rama y hacer un commit en esa rama. Esto creará una historia divergente.
Primero, creemos una nueva rama llamada feature
:
git branch feature
Este comando crea un nuevo puntero de rama llamado feature
que apunta al mismo commit que master
(nuestro commit más reciente, <commit-hash-3>
).
Ahora, cambiemos a la rama feature
:
git checkout feature
Deberías ver una salida que indique que has cambiado de rama:
Switched to branch 'feature'
Ahora estamos en la rama feature
. Hagamos un nuevo commit en esta rama. Crea un nuevo archivo:
echo "Feature content" > file2.txt
git add file2.txt
git commit -m "Add file2 on feature branch"
Verás una salida que confirme el commit en la rama feature
:
[feature <commit-hash-4>] Add file2 on feature branch
1 file changed, 1 insertion(+)
create mode 100644 file2.txt
Ahora, veamos la historia usando git log --oneline --all --graph
. La bandera --all
muestra los commits de todas las ramas y --graph
dibuja una representación basada en texto de la historia de los commits.
git log --oneline --all --graph
La salida mostrará una historia con ramificaciones. Puede verse algo así (los hashes de los commits variarán):
* <commit-hash-4> (HEAD -> feature) Add file2 on feature branch
* <commit-hash-3> (master) Add final content to file1
* <commit-hash-2> Add more content to file1
* <commit-hash-1> Add file1 with initial content
En este gráfico, <commit-hash-4>
es el commit más reciente en la rama feature
y <commit-hash-3>
es el commit más reciente en la rama master
. Estos dos commits no son ancestros el uno del otro. Comparten un ancestro común, que es <commit-hash-3>
(el commit donde se creó la rama feature
).
Usemos git merge-base --is-ancestor
para probar la relación entre <commit-hash-4>
y <commit-hash-3>
. Reemplaza los marcadores de posición con los hashes reales de tus commits.
git merge-base --is-ancestor <commit-hash-4> <commit-hash-3>
echo $?
Este comando comprueba si <commit-hash-4>
es un ancestro de <commit-hash-3>
. Según nuestro gráfico, no lo es. Por lo tanto, el comando debe finalizar con un estado de 1
.
Ahora, probemos al revés: ¿es <commit-hash-3>
un ancestro de <commit-hash-4>
?
git merge-base --is-ancestor <commit-hash-3> <commit-hash-4>
echo $?
Este comando comprueba si <commit-hash-3>
es un ancestro de <commit-hash-4>
. Mirando el gráfico, el padre de <commit-hash-4>
es <commit-hash-3>
. Entonces, <commit-hash-3>
es un ancestro de <commit-hash-4>
. El comando debe finalizar con un estado de 0
.
Esto demuestra cómo se puede usar git merge-base --is-ancestor
para comprobar programáticamente la relación entre cualquier par de commits en la historia de tu repositorio, incluso en diferentes ramas.