Git

Cómo aplastar los compromisos de Git

Cómo aplastar los compromisos de Git

Cómo aplastar confirmaciones en Git para mantener limpio su historial

Cuando trabaja con Git, es una buena idea comprometerse con frecuencia, para que siempre pueda volver al estado del código si falla. Sin embargo, realizar todos esos mini cambios en la rama principal no siempre es una buena idea. Hace que la historia sea complicada y difícil de seguir.

Git proporciona una forma de aplastar un montón de sus confirmaciones usando el comando rebase. Una vez que haya realizado localmente los cambios en un archivo en particular o para una característica en particular, siempre puede usar el método squash para combinar los cambios antes de comprometerse con la rama principal. Esto ayudará a otros a comprender mejor sus cambios.

Advertencia: aunque puede extraer de repositorios externos y aplastar confirmaciones juntas, es una mala idea. Puede crear conflictos y confusión. Evite cambiar la historia que ya es pública. Solo apégate a aplastar las confirmaciones que sean locales para tu trabajo.

Trabajemos en un caso de ejemplo.

Supongamos que tenemos dos archivos a.py y b.py. Primero veamos el proceso de crear los archivos y hacer las modificaciones:

$ mkdir myproject
$ cd myproject /
$ git init
$ echo "print (" hola A ")"> a.py
$ git add -A && git commit -m "Se agregó un.py "
$ echo "print (" hola B ")"> b.py
$ git add -A && git commit -m "Añadido b.py "
$ echo "print (" hola BB ")"> b.py
$ git add -A && git commit -m "b.py Modificación 1 "
$ echo "print (" hola BBB ")"> b.py
$ git add -A && git commit -m "b.Py Modificación 2 "

Si revisamos el historial de confirmaciones, veremos lo siguiente:

$ git log --oneline --graph --decorate
* dfc0295 (CABEZA -> maestro) b.py Modificación 2
* ce9e582 b.py Modificación 1
* 7a62538 Añadido b.py
* 952244a Se agregó un.py

Una vez que hayamos terminado con nuestro trabajo, decidimos poner todos los cambios en la b.py en un solo compromiso para mayor claridad. Contamos que hay 3 confirmaciones en b.py de la CABEZA. Emitimos el siguiente comando:

git rebase -i HEAD ~ 3

La opción -i le dice a Git que use el modo interactivo.

Debería aparecer una ventana en su editor de texto Git:

pick 7a62538 Agregado b.py
recoger ce9e582 b.py Modificación 1
elegir dfc0295 b.py Modificación 2
 
# Rebase 952244a… dfc0295 en 952244a (3 comando (s))
#
# Comandos:
# p, elegir = usar compromiso
# r, reword = use commit, pero edite el mensaje de commit
# e, edit = use commit, pero deténgase para enmendar
# s, squash = use la confirmación, pero se fusiona con la confirmación anterior
# f, fixup = like "squash", pero descarta el mensaje de registro de esta confirmación
# x, exec = ejecutar comando (el resto de la línea) usando shell
#
# Estas líneas se pueden reordenar; se ejecutan de arriba a abajo.
#
# Si quita una línea aquí ESE COMPROMISO SE PERDERÁ.
#
# Sin embargo, si eliminas todo, la rebase será abortada.
#
# Tenga en cuenta que las confirmaciones vacías están comentadas
~

Las confirmaciones se enumeran cronológicamente en la parte superior desde la más antigua hasta la más reciente. Puede elegir qué compromiso "elegir" y cuál compromiso para aplastar. Por simplicidad, elegiremos el primer compromiso y aplastaremos el resto en él. Entonces modificaremos el texto así:

pick 7a62538 Agregado b.py
calabaza ce9e582 b.py Modificación 1
calabaza dfc0295 b.py Modificación 2
 
# Rebase 952244a… dfc0295 en 952244a (3 comando (s))
#
# Comandos:
# p, elegir = usar compromiso
# r, reword = use commit, pero edite el mensaje de commit
# e, edit = use commit, pero deténgase para enmendar
# s, squash = usa la confirmación, pero se fusiona con la confirmación anterior
# f, fixup = like "squash", pero descarta el mensaje de registro de esta confirmación
# x, exec = ejecutar comando (el resto de la línea) usando shell
#
# Estas líneas se pueden reordenar; se ejecutan de arriba a abajo.
#
# Si quita una línea aquí ESE COMPROMISO SE PERDERÁ.
#
# Sin embargo, si elimina todo, la rebase será abortada.
#
# Tenga en cuenta que las confirmaciones vacías están comentadas

Tan pronto como guarde y cierre el archivo de texto, debería aparecer otra ventana de texto similar a esta:

# Esta es una combinación de 3 confirmaciones.
# El primer mensaje de confirmación es:
Añadido b.py
 
# Este es el segundo mensaje de confirmación:
 
B.py Modificación 1
 
# Este es el tercer mensaje de confirmación:
 
B.py Modificación 2
 
# Ingrese el mensaje de confirmación para sus cambios. Líneas que comienzan
# con '#' será ignorado y un mensaje vacío abortará la confirmación.
#
# Fecha: viernes 30 de marzo 21:09:43 2018-0700
#
# rebase en curso; en 952244a
# Actualmente está editando una confirmación mientras reajusta la rama 'master' en '952244a'.
#
# Cambios a comprometer:
# Nuevo archivo: b.py
#

Guarde y cierre este archivo también. Debería ver algo como esto:

$ git rebase -i HEAD ~ 3
[CABEZA separada 0798991] Se agregó b.py
Fecha: viernes 30 de marzo 21:09:43 2018-0700
1 archivo modificado, 1 inserción (+)
modo de creación 100644 b.py
Refs / heads / master correctamente rebasados ​​y actualizados.

Si revisa el historial de confirmaciones ahora:

$ git log --oneline --graph --decorate
* 0798991 (HEAD -> master) Añadido b.py
* 952244a Se agregó un.py

Todas las confirmaciones para b.py han sido aplastados en un compromiso. Puede verificar mirando la b.archivo py:

$ gato b.py
imprimir ("hola BBB")

Tiene el contenido de la Modificación 2.

Conclusión

La rebase es un comando poderoso. Puede ayudarte a mantener limpio tu historial. Pero evite usarlo para confirmaciones ya públicas, ya que puede causar conflictos y confusión. Úselo solo para su propio repositorio local.

Estudio adicional:

Cómo mostrar la superposición de OSD en aplicaciones y juegos de Linux en pantalla completa
Jugar juegos en pantalla completa o usar aplicaciones en modo de pantalla completa sin distracciones puede aislarlo de la información relevante del si...
Las 5 mejores cartas de captura de juegos
Todos hemos visto y amado la transmisión de juegos en YouTube. PewDiePie, Jakesepticye y Markiplier son solo algunos de los mejores jugadores que han ...
Cómo desarrollar un juego en Linux
Hace una década, no muchos usuarios de Linux predecían que su sistema operativo favorito algún día sería una plataforma de juegos popular para videoju...