¿Cómo aplastar las confirmaciones en git después de haber sido enviadas?
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 squash
y 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 pick
compromiso. 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?
Squash se compromete localmente con:
git rebase -i origin/master~4 master
donde ~4
significa los últimos 4 compromisos.
Esto abrirá su editor predeterminado. Aquí, reemplace pick
la 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 --force
y+
De la documentación de git push
:
Tenga en cuenta que esto
--force
se aplica a todas las referencias que se envían, por lo tanto, usarlo conpush.default
conjuntomatching
o con múltiples destinos de inserción configuradosremote.*.push
puede 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 +master
para forzar un empujón a lamaster
rama).
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
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
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ó.