2011-10-26 16 views
19

Tengo confirmación local que no está en ninguna rama que quisiera eliminar. No quiero volver a establecer una base de ellos, realmente quiero eliminarlos, y perder todo el contenido relacionado con estas confirmaciones.¿Cómo eliminar una confirmación de huérfano en git?

Es su un comando para hacerlo?

Hasta ahora he intentado rebase interactivo ya que muchos sugerido, pero simplemente muevo comprometerse alrededor, no los elimina. También intenté usar la eliminación de reflog, pero no puedo entender cómo pasar un identificador de compromiso específico al comando.

Aquí está el árbol de trabajo:

o [master] Commit #6 
| 
o Commit #5 
| 
| o Commit #4 
|/ 
o Commit #3 
| 
o Commit #2 
| 
o Commit #1 

quiero eliminar físicamente al cometer # 4.

+0

¿Podrías dar más detalles sobre "move commit around"? – greg0ire

+0

@ greg0ire Bueno, la confirmación aún existe, pero está vinculada a otra cosa ... Eso es lo que hace una rebase: cambiar el padre de confirmación ... ¿no? – FMaz008

+0

En la base de datos interactiva, debe eliminar por completo la línea con la confirmación que desea eliminar. Revertir la confirmación es simplemente crear una nueva confirmación aplicando la diferencia inversa de la especificada. Esto solo agrega otra confirmación que deberá eliminar. Prueba la rebase y elimina por completo la línea. –

Respuesta

28

Si el envío no se hace referencia por nada, se puede quitar con la recolección de basura de git, en el tiempo.

Si desea forzar que antes de la mano, utilice git gc --prune=now --aggressive

+0

Bueno, yo estaba en una sucursal, luego hice una confirmación, luego revertí la confirmación con una GUI (creo que esto corresponde a un restablecimiento completo). Así que ahora mi compromiso está fuera de toda rama, pero la confirmación sigue siendo "principal" para una sucursal. He intentado el comando, pero todavía tengo mis commits inútiles :( – FMaz008

+0

Revertir el commit en git no es solo quitar el commit. Realmente aplica el reverso del commit. Si el commit que no quieres está en el punta de una rama, utilice 'git restablecer shaOfLastGoodCommit' --hard. Eso va a quitar la entrega mala (s) y mover la punta de la rama a la última comprometerse. – Andy

+0

ya lo hice una --hard reinicio, dos veces .. .sólo cambió el encabezado de la rama (la "etiqueta maestra") al compromiso que quería eliminar, luego lo reemplacé en el encabezado real de la rama, pero el compromiso que deseo eliminar todavía está allí. – FMaz008

2

Para eliminar una confirmación, sólo tiene que asegurarse de que ya no forma parte de cualquier rama. Es decir, para cada sucursal de su repositorio, asegúrese de que el compromiso incorrecto no sea parte de la cadena de commits de hijo-a-padre que define esa rama. Si encuentra dicha rama, elimínela o cambie su historial para que ya no incluya la confirmación incorrecta.

Una vez que eso es cierto, la entrega mala será recolección de basura con el tiempo.

Cuestiones relacionadas