Recuerdo mi primera entrevista de trabajo como ingeniero de software. Después de responder correctamente preguntas sobre Git, como crear un repositorio, hacer un commit, un push y un pull, el entrevistador me lanzó una pregunta clave:
Mi respuesta fue un rotundo: "No lo sé". La solución era mucho más sencilla de lo que imaginaba, solo tenía que responder git merge. Diez años después, sigo utilizando git merge, pero con el tiempo eh aprendido que no es la única forma de integrar cambios entre ramas. Existe otra herramienta poderosa git rebase.
Práctica Git Merge
# 1. Crea un directorio llamado git-merge y entra a él.
mkdir git-merge
cd git-merge
# 2. Inicializa un repositorio de git.
git init
# Hacemos nuestro primer cambio en file.txt, agregamndos un texto.
echo "File 1" >> fileOne.txt
# Hacemos nuestro primer commit.
git add .
git commit -m "File 1"
Imaginemos que ahora debemos comenzar a desarrollar una nueva funcionalidad, por lo que creamos una rama llamada feature.
# Creamos una rama llamada feature.
git checkout -b feature
# Hacemos un cambio en file.txt.
echo "File 2" >> fileTwo.txt
# Hacemos un commit.
git add .
git commit -m "File 2"
Mientras trabajábamos alguien más hizo un cambio en la rama principal (master) y ese cambio me interesa tenerlo en mi rama feature.
# Cambiamos a la rama master.
git checkout master
# Hacemos un cambio en file.txt.
echo "File 3" >> fileThree.txt
# Hacemos un commit.
git add .
git commit -m "File 3"
Para incorporar los cambios de la rama master a la rama feature, utilizamos git merge.
# Cambiamos a la rama feature.
git checkout feature
# Pasamos los cambios de la rama master a la rama feature.
git merge master
Nos saldrá un mensaje indicando que debemos crear un commit de merge, para ello solo debemos guardar y cerrar el editor.
# Vea el historial de commits.
git log --oneline
Todo funcionó perfectamente, ahora tengo en mi rama feature los cambios de la rama master. Sin embargo, si observamos el historial de commits, veremos que se ha creado un commit de merge. Esto puede ser molesto, pues por cada cambio que necesite de master, irá creando un commit innecesario en mi historial. ¿Cómo puedo evitar esto? La respuesta es git rebase.
Repitamos los mismos pasos que seguimos con git merge, pero ahora con git rebase.
# Cambiamos a la rama feature.
git checkout feature
# Pasamos los cambios de la rama master a la rama feature.
git rebase master
# Successfully rebased and updated refs/heads/feature.
Historial de git
# Vea el historial de commits.
git log --oneline
1 - Ambos comandos tienen el mismo objetivo: pasar cambios de una rama a otra.
2 - Debemos usar git merge cuando queremos pasar cambios de una rama privada a una rama pública (master o develop). Esto nos ayudara a mantener historial de cuando fueron integrados los cambios en la rama principal.
3 - Usemos git rebase cuando queremos pasar cambios de una rama pública a una rama privada (feature). Esto nos ayudara a mantener un historial lineaR y ordenado.