Una de las cosas buenas de Git es que con unos pocos comandos uno trabaja la mayor parte del tiempo. Crear rama, mezclar ramas, guardar, subir y bajar cambios. Comandos concisos y de uso frecuente aunque hay uno que otro que es más avanzado y requiere de más cuidado y entendimiento cuando se usa, como es el caso de git rebase
.
En los próximos párrafos quiero explicar cómo usarlo de la forma más sencilla que sé.
¿Para qué usar git rebase?
De forma muy resumida, la idea de hacer un git rebase
es que los commits que se encuentren en la rama se pongan de primeros en el historial. Es como estar en la mitad de una fila y al ejecutar git rebase
, nos movemos al punto inicial.
Se hace para llevar un orden secuencial de cambios, evitar que algunos cambio se pierdan entre mezclas (aunque también se pueden perder con rebase) o para limpiar un historial de commits «sucios».
Un commit se puede denominar «sucio» cuando se hizo como parte de un proceso de análisis, se hizo como borrador (subí cambios para probar que la integración continua funcione) o es una larga cadena de commits para llegar a un destino final. Ejemplo:
$ git log -n5
72f2a05 (HEAD) PHYD-361 Add tests for metrics
104d64b PHYD-361 Add queries for rest of the initial metrics
a105242 PHYD-361 Add LoginMetricQuery
0463efa (origin/uat, uat) PHYD-366 / PHYD-367 Track chart and session modal (#616)
En este historial, los tres primeros commits hacen parte de una cadena para llegar a un resultado final.
Si yo quisiera convertir esos tres commits en uno, tendría que usar git rebase
para mezclarlos en uno solo. Se hace con el siguiente comando:
$ git rebase -i HEAD~3
Vamos a desglosar las opciones.
La bandera -i
es para indicar que queremos la opción interactiva. Esta abrirá el editor y nos permitirá configurar el rebase a nuestra preferencia.
Al escribir HEAD~3
le estoy diciendo al comando que use los tres últimos commits del historial.
El siguiente paso es que git abrirá mi editor preguntando sobre qué quiero hacer con esos commits:
reword a105242 PHYD-361 Add LoginMetricQuery
squash 104d64b PHYD-361 Add queries for rest of the initial metrics
squash 72f2a05 PHYD-361 Add tests for metrics
Git explica que hay opciones para cada commit:
- reword: usar el commit pero cambiar el mensaje
- pick: usar el commit tal cual
- squash: mezclar el commit con el anterior en la lista
- etc
Cuando queremos mezclar varios commits en uno, hay que tomar el primero como pick (o reword si quieres mejorar el mensaje) y los demás se le da la opción squash (o la letra s).
Si elegimos reword para alguno, antes de proceder, habrá que pasar por dicho paso. El comando abrirá nuevamente el editor configurado. Se reescribe, se guarda y se cierra el editor para ir al paso final.
Este paso final luce como esto, más o menos:
# This is a combination of 3 commits.
# The first commit's message is:
Introduce OpenPGP and teach basic usage.
# This is the 2nd commit message:
Fix PostChecker::Post#urls
# This is the 3rd commit message:
Hey kids, stop all the highlighting
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
Si quisiéramos mezclar en un solo commit, habría que comentar los mensajes de los que no nos interesan, guardar y cerrar el editor.
Una vez terminé en el caso que yo quería hacer rebase, la historia lucía así:
$ git log -n2
b9b4450 (HEAD -> phyd_361_extract_metrics) PHYD-361 Add queries to get metrics data
0463efa (origin/uat, uat) PHYD-366 / PHYD-367 Track chart and session modal (#616)
Tengo los mismos cambios pero en un solo commit. Esto hará más sencillo reversar cambios o ejecutar otro comando como git cherry-pick
para llevarme estos cambios a otra rama.
Nota
No uses la opción squash en el primer commit de la lista porque dará error ya que git no encontrará un commit anterior al cual mezclarle el primero. Por norma, al primero le doy la opción reword para usarlo pero cambiar el mensaje.
—
Enlaces