soft pushed example changes git github git-rebase git-reset git-revert

git - pushed - Necesito abrir y eliminar una confirmación "intermedia" en mi rama principal. ¿Cómo puedo hacerlo?



undo rebase git (3)

A pesar de todo el crédito que las respuestas originales recibieron aquí, no las encontré para responder satisfactoriamente la pregunta. Si se encuentra en una situación en la que necesita eliminar una confirmación, o una colección de confirmaciones a partir de la mitad de la historia, esto es lo que sugiero:

  • Crea una nueva rama en el encabezado de la que contiene todas las confirmaciones y cambia a ella.
  • Revierte la nueva rama al punto desde el que deseas comenzar una nueva base.
  • Luego, (aquí está el punto clave), selecciona las confirmaciones posteriores que realmente deseas que se apliquen luego de la rama original a la nueva, y omite las confirmaciones que ya no quieras (es decir, las que estás eliminando).
  • 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 a la que se llamó la original.
  • Finalmente, 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 Cherry Picking: ¿Qué significa cherry-picking a commit con git?

Aquí hay algunos sobre cómo hacerlo con Tortoise Git (como acabo de hacer). ¡Definitivamente es más fácil usar una utilidad gui para este tipo de operaciones! Selección de cereza con TortoiseGit

Por ejemplo, en la siguiente rama principal, necesito descartar solo la confirmación af5c7bf16e6f04321f966b4231371b21475bc4da, que es la segunda debido a la rebase anterior:

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

Necesito mantener

  • el primer commit 60b413512e616997c8b929012cf9ca56bf5c9113,
  • el tercero compromete e6523efada4d75084e81971c4dc2aec621d45530 y
  • el último commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

"tirando" solo el segundo commit af5c7bf16e6f04321f966b4231371b21475bc4da

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


Si rebase es una opción, puede rebasear y simplemente soltarlo:

$ git rebase -i 414ceffc^

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

$ git revert af5c7bf16


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 fusión de rechazo no de avance rápido .

Revertir es la solución correcta cuando la rama 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>^ Eso lo lleva a la confirmación justo antes de la que desea eliminar. El editor interactivo le mostrará una lista de todos los commits hasta ese punto. Puede elegir, aplastar, etc. En este caso, elimine la línea de la confirmación que desea borrar y guarde el archivo. Rebase terminará su trabajo.