2011-04-22 16 views
51

Por ejemplo, en la siguiente rama principal, necesito a la basura simplemente el commit af5c7bf16e6f04321f966b4231371b21475bc4da, que es la segunda causa de rebase anterior:Necesito abrir y eliminar una confirmación "intermedia" en mi rama principal. ¿Cómo puedo hacerlo?

commit 60b413512e616997c8b929012cf9ca56bf5c9113 
Author: Luca G. Soave <[email protected]> 
Date: Tue Apr 12 23:50:15 2011 +0200 

    add generic config/initializers/omniauth.example.rb 

commit af5c7bf16e6f04321f966b4231371b21475bc4da 
Author: Luca G. Soave <[email protected]> 
Date: Fri Apr 22 00:15:50 2011 +0200 

    show github user info if logged 

commit e6523efada4d75084e81971c4dc2aec621d45530 
Author: Luca G. Soave <[email protected]> 
Date: Fri Apr 22 17:20:48 2011 +0200 

    add multiple .container at blueprint layout 

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22 
Author: Luca G. Soave <[email protected]> 
Date: Thu Apr 21 19:55:57 2011 +0200 

    add %h1 Fantastic Logo + .right for 'Sign in with Github' 

I pertinencia de mantener

  • la Primera cometer 60b413512e616997c8b929012cf9ca56bf5c9113 ,
  • la Tercera cometer e6523efada4d75084e81971c4dc2aec621d45530 y
  • la última confirmación 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

"tirar" sólo el segundo cometer af5c7bf16e6f04321f966b4231371b21475bc4da

¿Cómo puedo hacer eso? Gracias de antemano Luca

Respuesta

66

Rebase o revertir son las opciones. Rebase realmente eliminará la confirmación del historial para que parezca que el segundo commit nunca existió. Esto será un problema si ha enviado la rama principal a cualquier otro repositorio. Si intenta presionar después de una rebase en este caso, git le dará un error de rechazo no rápido de fusiones error.

Revertir es la solución correcta cuando la bifurcación se ha compartido con otros repositorios. git revert af5c7bf16 hará una nueva confirmación que simplemente revierte los cambios que af5c7bf16 introdujo. De esta manera, la historia no se reescribirá, mantendrá un registro claro del error y otros repos aceptarán el empuje.

Aquí hay una buena manera de borrar: git rebase -i <commit>^ Esto lo lleva al compromiso justo antes del que desea eliminar. El editor interactivo le mostrará una lista de todos los commits hasta ese punto. Puede elegir, aplastar, etc. En este caso eliminar la línea para la confirmación que desea borrar y guardar el archivo. Rebase terminará su trabajo.

+1

En caso de que elija Rebase, ¿cuál es el derecho a rebase? Necesito dejar solo el segundo ... –

22

Si rebase es una opción, se puede reajustar y simplemente deja caer:

$ git rebase -i 414ceffc^ 

Si rebase no es una opción, sólo puede revertirlo:

$ git revert af5c7bf16 
+0

si recibí para "git rebase 414ceffc", que es la cuarta confirmación anterior, ¿no perderé también la tercera e6523 y la primera 60b41? –

+1

@Luca G. Soave: Solo "pierde" una confirmación si le dice específicamente a 'git rebase' que la suelte (ejecutando' rebase' en modo interactivo y eliminando su entrada). – mipadi

+0

Gracias mipadi, le doy mi voto a Jotton esencialmente por la extensa explicación, incluso si ustedes dos, dijeron lo mismo ... gracias de nuevo. –

5

A pesar de todo el crédito de las respuestas originales recibidas aquí, no las encontré para responder satisfactoriamente la pregunta. Si usted se encuentra en una situación donde es necesario eliminar una confirmación, o una colección de confirmaciones desde el centro de la historia, esto es lo que sugieren:

  • Crear una nueva rama de la cabeza de la que contiene todas las confirmaciones y cambiar a ella.
  • Revierte la nueva rama al punto desde el que deseas comenzar una nueva base.
  • Luego, (aquí está el punto clave) cherry pick las confirmaciones subsiguientes que realmente desea aplicar luego de la rama original a la nueva, y omita las confirmaciones que ya no desea (es decir, las que están borrando).
  • Si lo desea, cambie el nombre de la rama original a algo que indique que es código antiguo, y luego cambie el nombre de la nueva rama por la que se llamó.
  • Por último, envíe sus cambios a su repositorio remoto (si usa uno). Probablemente necesites usar un "empuje forzado". Si sus colaboradores tienen problemas para extraer las revisiones, podría ser más fácil para ellos clonar el repositorio nuevamente desde la fuente remota. De una forma u otra, ¡es probable que quieras hablar con ellos si estás cometiendo errores a la mitad de tu historia de todos modos!

Aquí hay información sobre el Cherry Picking: What does cherry-picking a commit with git mean?

He aquí alguna de hacerlo con la tortuga Git (como acabo de hacer). ¡Definitivamente es más fácil usar una utilidad gui para este tipo de operaciones! Cherry pick using TortoiseGit

+2

¡Esta debería haber sido la mejor respuesta! – MadOgre

Cuestiones relacionadas