Eliminar las confirmaciones de git antiguas

88

Soy muy nuevo en git y me preguntaba si algo como esto es posible.

>git log --pretty=oneline --abbrev-commit
2f05aba Added new feature
3371cec Fixed screw up    <-- I want to remove this
daed25c Screw up          <-- and remove this.
e2b2a84 First.                So it's like they never happend.

es posible?

Josh
fuente

Respuestas:

63

Esto es posible con git rebase. Prueba lo siguiente

git rebase -i HEAD~4

y luego, siga las instrucciones interactivas en su editor. En el primer paso, "aplasta" las confirmaciones. Debería verse algo como esto:

pick 2f05aba ... will be preserved
squash 3371cec ... will be squashed with daed25c
squash daed25c ... will be squashed with e2b2a84
pick e2b2a84 .. will contain this and 3371cec and daed25c

En el segundo paso, puede editar los mensajes de confirmación.

Deve
fuente
25
¿No es la cuestión de eliminar las confirmaciones en lugar de aplastarlas?
Richard
3
@Stony: Bueno, probablemente también podrías eliminarlos. Pero de los comentarios de confirmación en el OP ("Error" y "Error solucionado") asumí que uno está deshaciendo al otro y que también podrías aplastar los dos.
Deve
85

Si realmente desea eliminarlos (borrándolos del historial, para que nunca más se vean), puede

ejecutar rebase:

git rebase -i HEAD~4

y luego, simplemente elimine (o comente) las líneas correspondientes a las confirmaciones que desea eliminar, así:

pick 2f05aba ... #will be preserved
#pick 3371cec ... #will be deleted
#pick daed25c ... #will be deleted
pick e2b2a84 ... #will be preserved
Shathur
fuente
2
Soy nuevo en github, ¿cómo presionas los cambios después de eso? (Cuando hago clic en Sincronizar, simplemente revierte lo que hice). Creo que lo git push origin HEAD --force
entendí
@NicolasThery no lo haces. Es por eso que git push se niega a trabajar sin --force, porque estás reescribiendo el historial y romperás los repositorios de otras personas. Si ya presionó, su única opción es hacer un git revert. Lo cual, cuando lo piensas, es sensato porque si extraes el código de otra persona, no querrás que puedan borrar tus antiguas confirmaciones sin algún tipo de historial, ¿verdad?
Angry Dan
Supongo que esto simplemente funciona en el repositorio de Git actual y no cambia nada en sentido ascendente / cualquier otro nodo de Git.
Alexander Mills
2
@AlexanderMills No cambia nada en sentido ascendente siempre que no lo presione (y si lo hace, debe agregar la bandera --force como dijo Angry Dan).
Shathur
do dropes el comando para eliminar confirmaciones del historial.
Carrito abandonado
5

Para eliminar completamente las confirmaciones, ahora hay una nueva opción droppara las rebases interactivas de git. Primer intento:

git rebase -i HEAD~4

Luego reemplace pickcon droppara que se eliminen las confirmaciones:

pick 2f05aba ... #will be preserved
drop 3371cec ... #will be dropped
drop daed25c ... #will be dropped
pick e2b2a84 ... #will be preserved

Esto funcionó en Fedora para mí con la siguiente versión:

$ git version
git version 2.21.0
russoue
fuente
2

Squash es útil cuando desea generar una lista de confirmaciones combinadas bajo un solo hash, pero si está buscando tomar tres confirmaciones separadas y tener una salida final que parece ser una confirmación única, le recomiendo fixup

git rebase -i HEAD~4

pick 2f05aba ... will be preserved
fixup 3371cec ... will be merged with daed25c
fixup daed25c ... will be merged with e2b2a84
pick e2b2a84 .. will include 3371cec and daed25c, but only the commit message of e2b2a84

Puede encontrar más información en la lista de comandos de la interfaz de usuario de rebase interactiva.

Carro abandonado
fuente