¿Cómo aplastar las confirmaciones en git después de haber sido enviadas?

Resuelto Loren asked hace 13 años • 13 respuestas

Esto da una buena explicación de cómo aplastar múltiples confirmaciones:

http://git-scm.com/book/en/Git-Branching-Rebasing

pero no funciona para confirmaciones que ya han sido enviadas. ¿Cómo puedo eliminar las confirmaciones más recientes tanto en mis repositorios locales como remotos?

Cuando lo hago git rebase -i origin/master~4 master, mantengo el primero como pick, configuro los otros tres como squashy luego salgo (a través de cx cc en emacs), obtengo:

$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

donde 2f40 es el pickcompromiso. Y ahora ninguna de las 4 confirmaciones aparece en git log. Esperaba que mi editor se reiniciara para poder ingresar un mensaje de confirmación. ¿Qué estoy haciendo mal?

Loren avatar Apr 15 '11 01:04 Loren
Aceptado

Squash se compromete localmente con:

git rebase -i origin/master~4 master

donde ~4significa los últimos 4 compromisos.

Esto abrirá su editor predeterminado. Aquí, reemplace pickla segunda, tercera y cuarta líneas (ya que está interesado en las últimas 4 confirmaciones) con squash. La primera línea (que corresponde a la confirmación más reciente) debe dejarse con pick. Guarde este archivo.

Luego, su editor se abrirá nuevamente, mostrando los mensajes de cada confirmación. Comenta los que no te interesan (en otras palabras, deja sin comentar el mensaje de confirmación que corresponderá a este aplastamiento). Guarde el archivo y ciérrelo.

Luego deberá presionar nuevamente con el indicador -f.

y luego fuerce el empuje con:

git push origin +master

diferencia entre --forcey+

De la documentación de git push:

Tenga en cuenta que esto --forcese aplica a todas las referencias que se envían, por lo tanto, usarlo con push.defaultconjunto matchingo con múltiples destinos de inserción configurados remote.*.pushpuede sobrescribir referencias distintas a la rama actual (incluidas las referencias locales que están estrictamente detrás de su contraparte remota). Para forzar un empujón a una sola rama, use a + delante de refspec para empujar (por ejemplo, git push origin +masterpara forzar un empujón a la masterrama).

Alan Haggai Alavi avatar Apr 14 '2011 18:04 Alan Haggai Alavi

En una rama pude hacerlo así (para las últimas 4 confirmaciones)

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
jakob-r avatar Sep 16 '2015 11:09 jakob-r

Una pequeña diferencia con la respuesta aceptada, pero estaba teniendo muchas dificultades para aplastar y finalmente lo entendí.

$ git rebase -i HEAD~4
  • En la pantalla interactiva que se abre, reemplace elegir con aplastar en la parte superior para todas las confirmaciones que desee aplastar.
  • Guardar y cerrar el editor.

Presione hacia el control remoto usando:

$ git push origin branch-name --force
Sachin Rammoorthy avatar Dec 22 '2017 05:12 Sachin Rammoorthy

git rebase -i master

obtendrás el editor vm abierto y mensajes como este

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

Aquí he cambiado la selección de todas las demás confirmaciones a "f" (Significa reparación).

git push -f origin feature/feature-branch-name-xyz

esto arreglará todas las confirmaciones de una confirmación y eliminará todas las demás confirmaciones. Hice esto y me ayudó.

Nupur avatar Sep 26 '2017 10:09 Nupur