¿Qué es Git Squash?
Una de las cosas que los desarrolladores escuchan con bastante frecuencia con respecto a sus solicitudes de extracción es algo como "Eso me parece bien, por favor aplasta y fusiona". La parte divertida es que no existe un comando como git squash
(a menos que le cree un alias).
Para squash
tirar de los medios de solicitud comúnmente para compactar todos los comete en esta solicitud a uno (raramente a otro número) para que sea más concisa, fácil de leer y no contaminar la historia de la rama principal. Para lograr esto, un desarrollador necesita usar el modo interactivo del comando Git Rebase.
Muy a menudo, cuando desarrolla alguna característica nueva, termina con varias confirmaciones intermitentes en su historial; después de todo, se desarrolla gradualmente. Eso podría ser solo algunos errores tipográficos o pasos para la solución final. La mayoría de las veces no sirve de nada tener todas estas confirmaciones en la versión pública final de su código, por lo que es más beneficioso tenerlas todas compactadas en una única versión final.
Así que supongamos que tiene el siguiente registro de confirmación en la rama que le gustaría fusionar como parte de la solicitud de extracción:
$ git log --pretty=oneline --abbrev-commit 30374054 Add Jupyter Notebook stub to Data Science Tools 8490f5fc Minor formatting and Punctuation changes 3233cb21 Prototype for Notebook page
Claramente preferiríamos tener solo una confirmación aquí, ya que no hay ningún beneficio en saber qué comenzamos a escribir y qué errores tipográficos arreglamos allí más tarde. Solo el resultado final es importante.
Entonces, lo que hacemos es iniciar una sesión de rebase interactiva desde el HEAD actual (confirmación 30374054 ) para confirmar 3233cb21 , con la intención de combinar las 3 últimas confirmaciones en una:
$ git rebase -i HEAD~3
Eso abrirá un editor con algo como lo siguiente:
pick 3233cb21 Prototype for Notebook page pick 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools # Rebase # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
Como siempre, Git nos da un mensaje de ayuda muy bonito donde puedes ver la squash
opción que estamos buscando.
Actualmente, las instrucciones para la rebase interactiva dicen a pick
cada confirmación especificada y conservan el mensaje de confirmación correspondiente. Es decir, no cambie nada. Pero queremos tener solo una confirmación al final.
Por lo tanto, puede simplemente editar el texto en su editor reemplazando pick
con squash
(o simplemente s
) a continuación cada confirmación que queremos eliminar y guardar / salir del editor. Eso podría verse así:
s 3233cb21 Prototype for Notebook page s 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools
Cuando cierre su editor después de guardar este cambio, se volverá a abrir de inmediato y le sugerirá que elija y reformule esos mensajes de confirmación. Algo como esto:
# This is a combination of 3 commits. # The first commit's message is: Prototype for Notebook page # This is the 2nd commit message: Minor formatting and Punctuation changes # This is the 3rd commit message: Add Jupyter Notebook to Data Science Tools # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.
En este punto, puede eliminar todos los mensajes que no desea que se incluyan en la versión final de confirmación. También puede reformularlos o simplemente escribir un mensaje de confirmación desde cero.
Solo recuerda que la nueva versión incluirá todas las líneas que no comiencen con el #
personaje. Una vez más, guarde y salga de su editor.
Su terminal ahora debería mostrar un mensaje de éxito incluido Successfully rebased and updated
y el registro de git debería mostrar un historial agradable y compactado con solo una confirmación. ¡Todas las confirmaciones intermedias se han ido y estamos listos para fusionarnos!
Advertencia sobre la discrepancia del historial de confirmaciones local y remoto
Esta operación es un poco peligrosa si ya tiene su rama publicada en un repositorio remoto; después de todo, está modificando el historial de confirmaciones. Por lo tanto, es mejor realizar la operación de aplastamiento en una sucursal local antes de presionar .
A veces, ya se enviará; después de todo, ¿cómo crearía una solicitud de extracción? En este caso, tendrá que forzar los cambios en la rama remota después de hacer el aplastamiento, ya que su historial local y el historial de rama en el repositorio remoto son diferentes:
$ git push origin +my-branch-name
Haga todo lo posible para asegurarse de que es el único que usa esta rama remota en este punto, o le hará la vida más difícil al otro desarrollador cuando tenga un historial no coincidente. Pero dado que el aplastamiento generalmente se realiza como la operación final en una rama antes de deshacerse de ella, generalmente no es una gran preocupación.