Git: elimina la confirmación anterior pero conserva los cambios recientes

Tengo algunos commits en mi repository:

me gusta:

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

Donde E es el compromiso 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.

Espero que puedas ayudarme.

Gracias

Si solo desea "deshacerse de los cambios" (como se especifica en el cuerpo de su pregunta) en lugar de "eliminar un compromiso" (como se especifica en el título), una opción fácil es agregar un nuevo compromiso, haciendo exactamente lo contrario. de lo que hizo el compromiso anterior.

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

git revert es la herramienta utilizada para hacer que esos gemelos malvados se comprometan.

Rebase interactivo es tu amigo!

Como otros han dicho:

 $ git rebase -i HEAD~5 

… donde -i es la bandera interactiva, y HEAD~5 significa que incluye las últimas 5 confirmaciones en la database interactiva.

Cuando obtenga el editor como resultado de emitir lo anterior, eche un vistazo al comentario en el file 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-ordenetworking; 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 key para usted es: si elimina una línea aquí ESE COMPROMISO SERÁ PERDIDO.

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

Es importante tener en count que si ya ha presionado su código y otros lo han retirado, lo anterior no funcionará ya que las confirmaciones encontrarán su path de return allí la próxima vez que alguien que tiene su twig desprotegida haga un esfuerzo. La database interactiva elimina las confirmaciones en la medida en que no hay logging de ellas, por lo que los otros clones no saben que se han eliminado. La próxima vez que presionen, intentarán volver a instaurarlos ya que los clones locales "ven" que el origen no tiene los objects (confirmaciones) que usted ha eliminado.

Si solo tiene cambios a nivel local, probablemente sea mejor que siga una respuesta de rebase. Si ha publicado los cambios en cualquier lugar, entonces no quiere volver a establecer la base, porque eso cambiará el historial, lo que significa que todos los demás también tendrán que volver a establecer la base o se volverá a fusionar.

Si otras personas se comprometen, lo más claro es revertir el cambio ofensivo, no suprimirlo por completo. Utilice git revert COMMIT_ID para crear una nueva confirmación que deshaga los cambios que aplicó en COMMIT_ID .

esto se llama rebasamiento: quieres el -i cambiar.

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

para una pregunta / respuesta similar, consulte: http://sofes.miximages.com/a/2938393/2536029

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 

guarda y sale, luego

 git reset HEAD^ 

esto deshará la confirmación C.

 git reabse -i HEAD~3 

Tendrás la list de tus 3 últimos posts de compromiso

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

simplemente inserta x git reset HEAD ^ antes de la confirmación que desea deshacer, desea deshacer la confirmación C, por lo que será así

  C - Redesigned Feature C x git reset HEAD^ D - Added Feature D E - Added Feature D 

salga de la console de rebase, verá que su confirmación ya no está en el logging y sus files están en etapas.

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

Haga clic en la confirmación y podrá ver los files modificados a continuación. Haga clic derecho en los files que se revertirán y luego click revert to parent revision .

Cómo revertir confirmaciones

Intereting Posts