Eliminar la confirmación anterior pero mantener los cambios recientes

5 minutos de lectura

Avatar de usuario de Bernd Strehl
Bernd Strehl

Tengo algunas confirmaciones en mi repositorio como:

A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D

Donde E es la confirmación más reciente que hice. Ahora quiero deshacerme de los cambios que hice con la característica C pero quiero mantener los cambios agregados con D y E.

  • posible duplicado de Git: eliminando las entradas de registro de confirmación seleccionadas para un repositorio

    – John Szakmeister

    16 de julio de 2013 a las 10:24

  • @jszakmeister: no es exactamente lo mismo, la publicación vinculada quiere aplastar las confirmaciones, mientras que el OP quiere eliminarlas aquí

    – Carlos B

    16 de julio de 2013 a las 10:28

  • @CharlesB No es del todo cierto. Aplastar B y C fue una elección, al igual que eliminar las confirmaciones en la pregunta del OP. La respuesta contiene instrucciones sobre ambos.

    – John Szakmeister

    16/07/2013 a las 10:30

Reorganización interactiva ¡es tu amigo!

Como otros han dicho:

$ git rebase -i HEAD~5

…dónde -i es la bandera interactiva, y HEAD~5 significa incluir las últimas 5 confirmaciones en el rebase interactivo.

Cuando obtenga el editor como resultado de emitir lo anterior, eche un vistazo al comentario en el archivo abierto:

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

La clave para ti es Si elimina una línea aquí, ESE COMPROMISO SE PERDERÁ.

Por lo tanto, elimine las líneas que hacen referencia a las confirmaciones de las que desea deshacerse, guarde y cierre, y git se encargará del resto (es posible que deba solucionar algunos conflictos según la naturaleza de la confirmación y la reversión que está tratando de eliminar) ).

Es importante tener en cuenta que si ya ha enviado su código y otros lo han extraído, lo anterior no funcionará, ya que las confirmaciones encontrarán su camino de regreso allí la próxima vez que alguien que haya verificado su rama haga un envío. El rebase interactivo elimina los compromisos en la medida en que no hay registro de ellos, por lo que los otros clones no saben que se han eliminado. La próxima vez que presionen, intentarán restablecerlos ya que los clones locales “ven” que el origen no tiene los objetos (confirmaciones) que ha eliminado.

  • Esto está mucho mejor explicado aquí. Esta debería ser una respuesta aceptada.

    – Cirilo CHAPON

    15 de diciembre de 2016 a las 14:53

  • @CyrilCHAPON: si bien estoy de acuerdo en que esta es una buena respuesta (al título de la pregunta), en mi opinión, no es necesariamente la respuesta correcta a la pregunta indicada (en el cuerpo). La respuesta de IMO @ aib es la preferida, porque la reorganización es destructiva (reescribe el historial, como se indica en esta respuesta, pero no se destaca lo suficiente en IMO). A veces es la única respuesta, pero IMO rebase solo debe usarse en una rama maestra como último recurso.

    –Jeremy Davis

    2 de noviembre de 2017 a las 6:13

  • Impresionante, rebase interactivo es de hecho amigo.

    – legal

    13 de febrero a las 6:17

Si solo desea “deshacerse de los cambios” (como se especifica en el cuerpo de su pregunta) en lugar de “eliminar una confirmación” (como se especifica en el título), una opción fácil es agregando una nueva confirmación, haciendo exactamente lo contrario de lo que hizo la confirmación anterior.

No es infalible y puede dar lugar a conflictos debido a los cambios realizados desde entonces, pero no altera el historial, le permite documentar la reversión y sus motivos, y funciona bien con otras copias de trabajo.

git revert es la herramienta que se usa para hacer tales gemelos malvados de un conjunto de confirmaciones.

para hacer eso, sigue estos pasos:

git rebase -i HEAD~3

luego mueva commit C para ser el primero en la parte inferior, tendrá

D - Added Feature D
E - Added Feature D
C - Redesigned Feature C

guardas y sales, entonces

git reset HEAD^

esto deshará la confirmación C.

avatar de usuario de mnagel
mnagel

esto se llama rebaseing: quieres que el -i cambiar.

leer: https://www.atlassian.com/git/tutorial/rewrite-git-history#!rebase-i

para una pregunta/respuesta similar, consulte: https://stackoverflow.com/a/2938393/2536029

Si solo tiene cambios localmente, probablemente sea mejor que siga una respuesta de rebase. Si ha publicado los cambios en algún lugar, entonces no desea volver a establecer la base porque eso cambiará el historial, lo que significa que todos los demás también tendrán que cambiar la base o usted volverá a fusionar su confirmación infractora.

Si otras personas tienen sus compromisos, lo más limpio que puede hacer es revertir el cambio ofensivo, no eliminarlo por completo. Usar git revert COMMIT_ID para crear una nueva confirmación que deshaga los cambios que aplicó en COMMIT_ID.

Avatar de usuario de Tyler S. Loeper
Tyler S.Loeper

Usar git revertir

Por mucho, la mejor solución es usar git revert. Esto hará una nueva confirmación que deshace los cambios en un SHA específico. Esta es una forma muy segura de eliminar una confirmación y se puede fusionar fácilmente con otras sucursales remotas.

Cómo usar Git Revertir

git revert <insert bad commit hash here>

Avatar de usuario de Aminah Nuraini
Aminah Nuraini

Si usa TortoiseGit en Windows, puede hacer clic derecho en la carpeta Git y luego hacer clic en TortoiseGit > Show log. Puede ver todas las confirmaciones realizadas anteriormente y luego verificar la confirmación a la que desea volver.

Haga clic en confirmar y podrá ver los archivos modificados a continuación. Haga clic derecho en los archivos a revertir y luego haga clic en revert to parent revision.

Cómo revertir confirmaciones

¿Ha sido útil esta solución?