¿Cómo aprieto mis últimas N confirmaciones?
¿Cómo aprieto mis últimas N confirmaciones en una sola confirmación?
Puedes hacer esto con bastante facilidad sin git rebase
o 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 -i
comenzarí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>
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
.
Puedes usar git merge --squash
para 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 status
esté limpio (ya que git reset --hard
descartará 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 --squash
opció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 commit
sugerido 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.