2009-04-21 12 views
78

¿Hay algún comando que le permita deshacer parcialmente los cambios en un archivo (o archivos) en el directorio de trabajo?¿Invertir o pagar cambios selectivamente a un archivo en Git?

Supongamos que ha editado un archivo mucho pero se da cuenta de que desea deshacer algunos de los cambios al estado comprometido, pero no a los otros cambios.

Estoy visualizando una opción para git checkout que funciona muy similar a git add -p, es decir, pasa por el trozo de archivo por trozo y le pregunta si desea conservarlo o no.

Respuesta

74

Usted podría utilizar

git add -p <path> 

para organizar los trozos que desea guardar en un archivo en particular, entonces

git checkout -- <path> 

para descartar los cambios en el árbol de trabajo que usted no desea mantener , revisando la versión por etapas del archivo.

Por último, puede utilizar

git reset -- <path> 

para revertir la versión progresiva de ese archivo a la versión más reciente del archivo comprometido a dejar con sus cambios no escénica.

+0

Creo que esto es lo que estoy buscando gracias –

+0

Para este caso de uso simple, que cualquier otro sistema de control de versiones simplemente llama "revertir", ¿por qué el comando Git es tan oscuro? –

+5

@Jan ¿El comando 'revert' de otros sistemas de control de versiones le permite seleccionar qué cambios dentro de un archivo se revierten?Genuinamente preguntando, ya que solo tengo experiencia con CVS y Git. En Git, 'git checkout - path/to/file' es un comando único que revierte todos los cambios en ese archivo, pero este no es el mismo que el anterior. – spacemanaki

8

git checkout $file revierte el estado del archivo $file al último estado confirmado. Creo que puede usar git checkout SHA-1 -- $file para revertir el archivo a la confirmación identificada por SHA-1.

+1

sí, no es exactamente lo que quiero, ya que quiero mantener algunos de los cambios que he hecho en el archivo y revertir los otros –

1

¿Cuántas confirmaciones necesita volver y seleccionar? Si es solo uno, tal vez tome una sucursal justo antes, revise el archivo que ha confirmado y luego use git add -p para agregarlo como lo desea. Luego puedes volver al lugar donde estabas y sacar el archivo de tu rama temporal.

que es:

git checkout -b temp troublesome-commit^ 
git checkout troublesome-commit -- path/to/file 
git add -p path/to/file 
git commit -c troublesome-commit 
git checkout @{-1} 
git checkout temp -- path/to/file 
git commit path/to/file 
git branch -D temp 

Otras alternativas incluyen volver y editar el commit con git rebase -i (marcado el commit como edit, a continuación, haciendo un git reset HEAD^ y rehacer el commit cuando se deja caer de nuevo en la cáscara).

Si los cambios que necesita seleccionar están distribuidos en una serie de confirmaciones, puede ser mejor extraerlos como parches (o un parche que los cubra a todos) y editar manualmente el parche, eliminando los cambios que desea mantener y alimentar el residuo en git apply --reverse.

+0

No quiero revertir nada que esté comprometido, quiero deshacer los cambios que están solo en mi copia de trabajo –

99

Con la versión git> = 1.7.1 puedo

git checkout -p 

no estoy seguro cuando se introdujo esta característica.

+8

Vale la pena mencionar que también puede hacer 'git reset -p' para eliminar de forma selectiva los cambios del área/índice de ensayo. Tampoco sé de primera mano en qué versión de Git se presentó esto. –

+0

Esta es la respuesta correcta, por qué no ha sido aceptada. – wukong

+0

@wukong porque esta respuesta se ha publicado dos años después de la pregunta. En este momento (2009), la respuesta de Charles fue la mejor solución – pomeh

Cuestiones relacionadas