Puede usar git checkout -p
, que le permite elegir trozos individuales de la diferencia entre su copia de trabajo y el índice para revertir. Del mismo modo, le git add -p
permite elegir trozos para agregar al índice y le git reset -p
permite elegir trozos individuales de la diferencia entre el índice y HEAD para retroceder fuera del índice.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Si desea tomar una instantánea de su repositorio git de antemano para preservar estos cambios antes de revertirlos, me gusta hacer:
$ git stash; git stash apply
Si usa eso a menudo, es posible que desee asignarle un alias:
[alias]
checkpoint = !git stash; git stash apply
Revertir trozos o líneas individuales puede ser aún más fácil si usa un buen modo de editor o complemento, que puede proporcionar soporte para seleccionar líneas directamente para revertir, ya -p
que a veces puede ser un poco torpe usarlo. Uso Magit , un modo Emacs que es muy útil para trabajar con Git. En Magit, puede ejecutar magit-status
, encontrar las diferencias para los cambios que desea revertir, seleccionar las líneas que desea revertir (o simplemente colocar el cursor en los trozos que desea revertir si desea revertir un trozo a la vez en lugar de una línea a la vez) y presione k
para revertir esas líneas específicas. Recomiendo encarecidamente Magit si usa Emacs.
git checkout
también tiene una-p
bandera, que hace exactamente lo que pedías en un solo comando. Disculpas por el complejo conjunto de pasos anteriores; solo puedes usargit checkout -p
. En cuanto a guardar cosas, antes de hacer algo potencialmente destructivo, a menudo hago ungit stash; git stash apply
(o creo un alias que hace eso comogit checkpoint
o algo) para registrar el árbol actual en un alijo para poder volver a él si algo sale mal.git commit -a -m "Backup Commit" --edit; git reset HEAD^
sería mejor, porque entonces no ensuciaría mi estado oculto, que podría estar usando para otra cosa. Luego, siempre que tenga el SHA1, puede elegirlo dentro de los próximos 30 días. --Edit le permite agregar información al mensaje de confirmación para ayudarlo a encontrar el SHA1 más adelante si lo desea. Por otro lado, esto ensuciaría el registro de git, así que supongo que es una compensación basada en lo que haces.git checkout -p
no se apliquen los parches al índice sino que solo se los escalone?Luego edite el archivo de parche y elimine las partes que no desea deshacer, luego:
fuente
patchfile
ve muy bien en vim y realmente ayuda!git apply -R
lugar depatch
(solo para permanecer dentro de los reinos de git, o en el caso diferente quepatch
no está disponible)patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
Podrías hacerlo
Para cada archivo que desea restablecer.
fuente
Qué tal si
git add -p
para volver a agregar los cambios que desea al índice.fuente
Cuando ejecuto 'git status', dice:
Entonces, para cancelar las ediciones no preparadas, me dice que ejecute:
fuente
La respuesta de Brian Campbell bloquea mi git, versión 1.9.2.msysgit.0, por razones desconocidas, por lo que mi enfoque es poner en escena a los trozos que quiero conservar, descartar los cambios en la copia de trabajo y luego quitar el escenario.
fuente
git stash -p
. Usted podría hacergit stash -p; git reset --hard; git stash pop
. Esto es efectivamente lo mismo que estás haciendo, excepto que no tienes que escribir un mensaje de confirmación.puede hacer
git checkout
y darle nombres de las partes que desea deshacer.fuente