Buscar..


Observaciones

¿Qué es aplastar?

Squashing es el proceso de tomar múltiples confirmaciones y combinarlas en una única confirmación que encapsula todos los cambios de las confirmaciones iniciales.

Aplastamiento y ramas remotas

Preste especial atención al aplastar las confirmaciones en una rama que está siguiendo una rama remota; si aplasta una confirmación que ya ha sido empujada a una rama remota, las dos ramas se desviarán, y tendrá que usar git push -f para forzar esos cambios en la rama remota. Tenga en cuenta que esto puede causar problemas para otros que rastrean esa rama remota , por lo que se debe tener cuidado al forzar el empuje de confirmaciones aplastadas en depósitos públicos o compartidos.

Si el proyecto está alojado en GitHub, puede habilitar "forzar protección de inserción" en algunas sucursales, como la master , agregándolo a Settings - Branches - Protected Branches .

Squash Comidas Recientes Sin Rebasar

Si desea aplastar las x confirmaciones anteriores en una sola, puede usar los siguientes comandos:

git reset --soft HEAD~x
git commit

Reemplazando x con el número de confirmaciones previas que desea incluir en la confirmación aplastada.

Tenga en cuenta que esto creará una nueva confirmación, que esencialmente olvidará la información sobre las x confirmaciones anteriores, incluidos su autor, mensaje y fecha. Probablemente desee copiar y pegar primero un mensaje de confirmación existente.

Squashing Commits Durante una Rebase

Los compromisos pueden ser aplastados durante una git rebase . Se recomienda que usted entiende cambio de base antes de intentar la calabaza se compromete de esta manera.

  1. Determine de qué compromiso desea cambiar y anote su hash de confirmación.

  2. Ejecutar git rebase -i [commit hash] .

    Alternativamente, puede escribir HEAD~4 lugar de un hash de confirmación, para ver la confirmación más reciente y 4 confirmaciones más antes de la última.

  3. En el editor que se abre al ejecutar este comando, determine qué confirmaciones desea aplastar. Reemplace pick al principio de esas líneas con squash para aplastarlos en el commit anterior.

  4. Después de seleccionar las confirmaciones que le gustaría aplastar, se le pedirá que escriba un mensaje de confirmación.

Logging se compromete a determinar dónde rebase

> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit

> git rebase -i 36d15de

En este punto, su editor de elección aparece donde puede describir lo que quiere hacer con los compromisos. Git proporciona ayuda en los comentarios. Si lo deja como está, no pasará nada, ya que se mantendrán todos los compromisos y su orden será la misma que antes de la rebase. En este ejemplo aplicamos los siguientes comandos:

pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed

# Rebase 36d15de..612f2f7 onto 36d15de (3 command(s))
#
# 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

Git log después de escribir el mensaje de confirmación

> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit

Autosquash: confirma el código que deseas suprimir durante un rebase

Dado el siguiente historial, imagine que realiza un cambio que desea aplastar en la confirmación bbb2222 A second commit :

$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit

Una vez que haya realizado los cambios, puede agregarlos al índice como de costumbre y luego cometerlos usando el argumento --fixup con una referencia al compromiso que desea aplastar:

$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit

Esto creará una nueva confirmación con un mensaje de confirmación que Git puede reconocer durante una reorganización interactiva:

$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit

A continuación, realice una rebase interactiva con el argumento --autosquash :

$ git rebase --autosquash --interactive HEAD~4

Git te propondrá que commit --fixup el compromiso que hiciste con el commit --fixup en la posición correcta:

pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit

Para evitar tener que escribir --autosquash en cada rebase, puede habilitar esta opción de manera predeterminada:

$ git config --global rebase.autosquash true

Squashing Commit Durante Merge

Puede usar git merge --squash para aplastar los cambios introducidos por una rama en un solo compromiso. No se creará ningún compromiso real.

git merge --squash <branch>
git commit

Esto es más o menos equivalente a usar git reset , pero es más conveniente cuando los cambios que se incorporan tienen un nombre simbólico. Comparar:

git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit

Autosquashing y reparaciones

Al confirmar cambios, es posible especificar que la confirmación en el futuro se aplastará a otra confirmación y esto se puede hacer así.

git commit --squash=[commit hash of commit to which this commit will be squashed to]

También se puede usar, --fixup=[commit hash] alternativa para corregir.

También es posible usar palabras del mensaje de confirmación en lugar del hash de confirmación, como así,

git commit --squash :/things

donde se usaría el compromiso más reciente con la palabra 'cosas'.

¡El mensaje de estas confirmaciones comenzaría con 'fixup!' o 'squash!' seguido del resto del mensaje de confirmación al que se aplastarán estas confirmaciones.

Cuando se --autosquash , se debe usar el indicador deautosquash para usar la función autosquash / fixup.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow