2012-03-15 30 views
46

Soy muy nuevo en git y me preguntaba si algo como esto es posible.Eliminar el antiguo git commits

>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. 

¿Esto es posible?

Respuesta

42

Esto es posible con git rebase. Pruebe lo siguiente

git rebase -i HEAD~4 

y luego, siga las instrucciones interactivas en su editor. En el primer paso "aplasta" los commits. 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.

+10

¿No se trata de eliminar las confirmaciones en lugar de aplastarlas? – Richard

+1

@Stony: Bueno, probablemente también podrías eliminarlos. Pero a partir de los comentarios de confirmación en el OP ("Screw up" y "Fixed screw up"), asumí que uno está deshaciendo el otro y que también podrías aplastar los dos. – Deve

54

Si realmente desea eliminarlos (limpiándolos de la historia, para no ser visto nunca más), puede

ejecución rebase:

git rebase -i HEAD~4 

y luego, simplemente borre (o comente) las líneas correspondientes a las confirmaciones que desea eliminar, como las siguientes:

pick 2f05aba ... #will be preserved 
#pick 3371cec ... #will be deleted 
#pick daed25c ... #will be deleted 
pick e2b2a84 ... #will be preserved 
+0

Soy nuevo en github, ¿cómo presionas los cambios después? (Cuando hago clic en Sincronizar, solo revierte lo que hice). Creo que lo tengo: 'git push origen HEAD --force' –

+0

@NicolasThery no. Es por eso que git push se niega a trabajar sin --force, porque estás reescribiendo el historial y romperás repositorios de otras personas. Si ya has pulsado, tu única opción es hacer un 'git revert'. Lo cual, cuando lo piensas es sensato porque si sacas el código de otra persona no querrás que borren tus antiguos commits sin algún tipo de historial, ¿o sí? –

+0

Supongo que esto simplemente funciona en el repositorio de Git actual y no cambia nada en sentido ascendente/ningún otro nodo de Git? –

Cuestiones relacionadas