¿Cómo aprieto mis últimas N confirmaciones?

Resuelto markdorison asked hace 13 años • 46 respuestas

¿Cómo aprieto mis últimas N confirmaciones en una sola confirmación?

markdorison avatar Mar 04 '11 11:03 markdorison
Aceptado

Puedes hacer esto con bastante facilidad sin git rebaseo git merge --squash. En este ejemplo, aplastaremos las últimas 3 confirmaciones.

Si deseas escribir el nuevo mensaje de confirmación desde cero, esto es suficiente:

git reset --soft HEAD~3
git commit

Si desea comenzar a editar el nuevo mensaje de confirmación con una concatenación de los mensajes de confirmación existentes (es decir, similar a lo que git rebase -icomenzaría con una lista de instrucciones pick/squash/squash/…/squash), entonces necesita extraer esos mensajes y pasarlos. a ellos git commit:

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Ambos métodos agrupan las últimas tres confirmaciones en una única confirmación nueva de la misma manera. El restablecimiento parcial simplemente vuelve a señalar HEAD a la última confirmación que no desea eliminar. El reinicio por software no afecta ni al índice ni al árbol de trabajo, lo que deja el índice en el estado deseado para su nueva confirmación (es decir, ya tiene todos los cambios de las confirmaciones que está a punto de “descartar”).

Editar según los comentarios

Ha reescrito ese historial y luego debe usar el indicador --force para devolver esta rama al control remoto. Para esto está destinada la bandera de fuerza, pero puedes tener mucho cuidado y definir siempre completamente tu objetivo.

git push --force origin <branch-name>
Chris Johnsen avatar Mar 05 '2011 04:03 Chris Johnsen

Utilice git rebase -i <after-this-commit>y reemplace "pick" en la segunda confirmación y posteriores con "squash" o "fixup", como se describe en el manual .

En este ejemplo, <after-this-commit>es el hash SHA1 o la ubicación relativa del HEAD de la rama actual desde la cual se analizan las confirmaciones para el comando de rebase. Por ejemplo, si el usuario desea ver 5 confirmaciones del HEAD actual en el pasado, el comando es git rebase -i HEAD~5.

Anomie avatar Mar 04 '2011 04:03 Anomie

Puedes usar git merge --squashpara esto, que es un poco más elegante que git rebase -i. Suponga que está en master y desea agrupar las últimas 12 confirmaciones en una.

ADVERTENCIA: Primero asegúrese de confirmar su trabajo; verifique que git statusesté limpio (ya que git reset --harddescartará los cambios preparados y no preparados).

Entonces:

# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit

La documentacióngit merge describe la --squashopción con más detalle.


Actualización: la única ventaja real de este método sobre el más simple git reset --soft HEAD~12 && git commitsugerido por Chris Johnsen en su respuesta es que el mensaje de confirmación se completa previamente con cada mensaje de confirmación que está aplastando.

Mark Longair avatar Mar 04 '2011 06:03 Mark Longair