Cómo aplastar git cometa

Cómo aplastar git cometa

Cómo aplastar los compromisos en Git para mantener su historial limpio

Cuando trabaja con GIT, es una buena idea comprometerse con frecuencia, por lo que siempre puede volver al estado del código si se equivoca. Sin embargo, cometer todos esos mini-changos a la rama principal no siempre es una buena idea. Hace que la historia sea desordenada y difícil de seguir.

Git proporciona una forma de aplastar un montón de sus compromisos utilizando el comando Rebase. Una vez que haya realizado localmente sus cambios en un archivo en particular o para una característica en particular, siempre puede usar el método de 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 comodidades de squash, es una mala idea. Puede crear conflictos y confusión. Evite cambiar la historia que ya sea pública. Solo adhiérase a los compromisos de aplastamiento que son locales para su trabajo.

Trabajemos en un caso de ejemplo.

Supongamos que tenemos dos archivos a.Py y B.py. Primero pasemos por 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 "agregó un.py "
$ echo "print (" hola b ")"> b.py
$ git add -a && git commit -m "agregado b.py "
$ echo "print (" hola bb ")"> b.py
$ git add -a && git commit -m "b.Modificación PY 1 "
$ echo "print (" hola bbb ")"> b.py
$ git add -a && git commit -m "b.Modificación PY 2 "

Si verificamos el historial de comodidades, veremos lo siguiente:

$ git log --oneline --graph --decor
* DFC0295 (cabeza -> maestro) B.PY Modificación 2
* CE9E582 B.Modificación PY 1
* 7A62538 agregado B.py
* 952244a agregó un.py

Después de que hayamos terminado con nuestro trabajo, decidimos poner todos los cambios a la B.py en un solo compromiso para mayor claridad. Cuentamos que hay 3 compromisos 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.

Debe aparecer una ventana en su editor de texto Git:

Elija 7A62538 agregado B.py
Elija CE9E582 B.Modificación PY 1
Elija DFC0295 B.PY Modificación 2
# Rebase 952244a ... DFC0295 en 952244A (3 comando (s))
#
# Comandos:
# P, Pick = Usar Commit
# r, reword = use Commit, pero edite el mensaje de confirmación
# e, editar = usar confirmación, pero detente para modificar
# s, squash = use commit, pero se fusiona en un commit anterior
# F, FixUp = Like "Squash", pero descarte el mensaje de registro de este comité
# x, comando ejecut = ejecut (el resto de la línea) usando shell
#
# Estas líneas se pueden reordenar; se ejecutan de arriba a abajo.
#
# Si elimina una línea aquí que se perderá.
#
# Sin embargo, si elimina todo, el Rebase será abortado.
#
# Tenga en cuenta que se comentan los confirmaciones vacías
~

Los compromisos se enumeran cronológicamente en la cima desde la primera a la más reciente. Puedes elegir qué compromiso para "elegir" y qué se compromete a la calquería. Para simplificar, elegiremos el primer cometer y aplastaremos el resto. Entonces modificaremos el texto así:

Elija 7A62538 agregado B.py
Squash CE9E582 B.Modificación PY 1
Squash DFC0295 B.PY Modificación 2
# Rebase 952244a ... DFC0295 en 952244A (3 comando (s))
#
# Comandos:
# P, Pick = Usar Commit
# r, reword = use Commit, pero edite el mensaje de confirmación
# e, editar = usar confirmación, pero detente para modificar
# s, squash = use commit, pero se fusiona en un commit anterior
# F, FixUp = Like "Squash", pero descarte el mensaje de registro de este comité
# x, comando ejecut = ejecut (el resto de la línea) usando shell
#
# Estas líneas se pueden reordenar; se ejecutan de arriba a abajo.
#
# Si elimina una línea aquí que se perderá.
#
# Sin embargo, si elimina todo, el Rebase será abortado.
#
# Tenga en cuenta que se comentan los confirmaciones vacías

Tan pronto como guarde y cierre el archivo de texto, debe surgir otra ventana de texto que se vea así:

# Esta es una combinación de 3 compromisos.
# El mensaje del primer comité es:
Se agregó B.py
# Este es el segundo mensaje de confirmación:
b.Modificación PY 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 aborta la confirmación.
#
# Fecha: viernes 30 de marzo 21:09:43 2018 -0700
#
# Rebase en progreso; en 952244a
# Actualmente está editando un compromiso mientras se reubica a la rama 'maestro' en '952244a'.
#
# Cambios para ser cometidos:
# 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] Agregado B.py
Fecha: viernes 30 de marzo 21:09:43 2018 -0700
1 archivo cambiado, 1 inserción (+)
Crear modo 100644 b.py
Refs/cabezas/maestros rebotados y actualizados con éxito.

Si revisa el historial de confirmación ahora:

$ git log --oneline --graph --decor
* 0798991 (cabeza -> maestro) agregado b.py
* 952244a agregó un.py

Todos los compromisos para B.py ha sido aplastado en un solo compromiso. Puedes verificar mirando la B.Archivo PY:

$ Cat B.py
Imprimir ("Hola BBB")

Tiene el contenido de la modificación 2.

Conclusión

El Rebase es un comando poderoso. Puede ayudarlo a mantener su historial limpio. 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:

  • https: // git-scm.com/docs/git-reasbase
  • https: // git-scm.com/book/en/v2/git-ramking-Reasing
  • https: // git-scm.com/book/en/v2/git-tools-reescritura