2009-07-10 10 views
123

En mi git repo, que está rastreando un svn repo, he realizado varias ediciones en un único archivo.git selectivo revertir cambios locales desde un archivo

Ahora quiero revertir esos cambios (como svn revertir), pero solo partes del archivo.

Quiero poder ver los diffs en el archivo, descartar (revertir) los cambios que no deseo y conservar los cambios que deseo.

el comando

git add -i 

parece tener una opción para hacer eso, pero yo no quiero poner en escena esta todavía.

Respuesta

74

Puede hacerlo directamente con git checkout -p. Ver Daniel Stutzbach's answer a continuación.


respuesta Viejo (antes checkout -p se introdujo):

Puede hacerlo de esta manera:

git add -i 

(seleccionar los trozos que desea mantener)

git commit -m "tmp" 

Ahora tiene una confirmación con solo los cambios que nt para mantener, y el resto no está en escena.

git reset --hard HEAD 

En este punto, los cambios no confirmados han sido descartados, por lo que tiene un directorio de trabajo limpio, con los cambios que desea mantener su compromiso en la parte superior.

git reset --mixed HEAD^ 

Esto elimina la última confirmación ('tmp'), pero mantiene las modificaciones en el directorio de trabajo, sin preparar.

EDITAR: reemplazó --soft con --mixed, para limpiar el área de preparación.

+0

esto confirmará los cambios que quiero mantener ¿no? No quiero comprometer esos cambios todavía. mm tal vez estoy tomando compromisos demasiado en serio. Tal vez debería relajarme ahora, ya que todo está en un repositorio local. por cierto, ¿qué hace el git reset --soft HEAD^do? – Pradeep

+0

"git reset --soft HEAD ^" deshace una confirmación en el sentido de que mantiene el directorio y el índice de trabajo como estaba, y mueve de vuelta la confirmación de la rama uno. –

+0

Gracias Jakub. Paolo ¿por qué un reinicio suave a la cabeza - 1 se requiere aquí? la confirmación parcial y el restablecimiento completo deberían ser suficientes para mantener algunos cambios y descartar otros? – Pradeep

3

Usted podría funcionar git diff en el archivo, guardar el diff resultante, editarlo para eliminar los cambios que haces desea guardar, a continuación, ejecute a través de patch -R para deshacer los diferenciales restantes.

git diff file.txt >patch.tmp 
# edit patch.tmp to remove the hunks you want to keep 
patch -R <patch.tmp
+0

Tenía 2 trozos en mi archivo de parche y eliminé uno. No estoy seguro de cuál es la razón, pero el parche -R sigue siendo rechazado con esto. – Pradeep

+2

Menciona en otro comentario que 'git diff' muestra el archivo completo como cambiado. Esto generalmente sucede cuando ha guardado el archivo usando diferentes finales de línea de lo que era anteriormente. Esto también causaría que 'parche' rechazara el archivo de parche. ¿Eso suena como lo que podría haber pasado? –

+0

tienes razón. los finales de línea se cambian cada vez que uso el comando de parche. Estoy en windows y uso cream/vim. Necesito resolver esto primero, creo. – Pradeep

2

Parece que desea

git revert --no-commit $REVSISON 

A continuación, puede utilizar

git diff --cached 

para ver lo que el cambio se hizo antes de comprometerse (como reversión es sólo una confirmación en una dirección hacia delante que replica el inverso de un cambio en el pasado)

Si tuviera una En el repositorio de Git, podría, dependiendo de sus objetivos, utilizar la base de datos interactiva (git rebase -i) para volver al compromiso que no le gustó y editar el compromiso de forma retroactiva para que los cambios que no le gusten nunca ocurrieran, pero en general solo si usted SABE, nunca querrá volver a verlo.

+0

Revertí como mencionaste a una revisión anterior (¿es correcto?) Y ahora git diff solo muestra el archivo completo como cambiado. Se supone que debe mostrar las ediciones que he hecho? – Pradeep

+0

se supone que debe mostrar los cambios "restituidos" –

1

Al volver a leer la pregunta, parece que desea revertir los cambios que se encuentran en su árbol de trabajo y no los cambios que se han cometido previamente, pero algunas de las otras respuestas hacen sonar como que mi lectura puede ser incorrecta. ¿Puedes aclarar?

Si los cambios son sólo en su copia de trabajo a continuación, la forma más sencilla de hacerlo es poner en escena los cambios que desea mantener con:

git add -i <file> 

luego tirar los cambios que no desee mantener por el control de la versión índice:

git checkout -- <file> 

Entonces unstage los cambios si no desea que ellos todavía en escena:

git reset -- <file> 

Esta receta solo revierte los cambios seleccionados al archivo (o los archivos que especifique) y no crea ningún compromiso temporal que luego deba revertirse.

Si desea aplicar selectivamente sólo algunos de los cambios realizados en confirmaciones anteriores a continuación, puede restablecer un archivo a un estado comprometida anterior primero:

git reset <commit_before_first_unwanted_change> -- <file> 

continuación, puede seguir la receta anterior de git add -i <file> poner en escena esos cambios que desea mantener, git checkout -- <file> para descartar los cambios no deseados y git reset -- <file> para 'dejar de lado' los cambios.

279

que cree que puede hacer que la mayoría simplemente con:

git checkout -p <optional filename(s)> 

Desde la página de manual:

−p, −−patch 
     Interactively select hunks in the difference between the <tree−ish> 
     (or the index, if unspecified) and the working tree. The chosen 
     hunks are then applied in reverse to the working tree (and if a 
     <tree−ish> was specified, the index). 
 This means that you can use git checkout −p to selectively discard 
     edits from your current working tree. 
+35

Esta debería ser la respuesta aceptada, hace exactamente lo que quiere. – vdboor

+1

Además, si no desea hacer esto de forma selectiva, puede usar "git checkout - ..." para descartar cambios. – db42

+0

Sí, de hecho, ¿por qué no se cambia la respuesta? – lkraav

0

Las opciones de línea de comandos que se describen en las respuestas aquí son útiles cuando el archivo es en un servidor al que estoy accediendo a través de una terminal ssh. Sin embargo, cuando el archivo está en mi máquina local, prefiero la siguiente manera:

Abra el archivo en el editor netbeans (que viene con soporte git). Netbeans pone marcas rojas/verdes/azules en los números de línea para indicar dónde se borraron/agregaron/modificaron las cosas (respectivamente).

Hacer clic con el botón derecho en cualquiera de estas marcas le ofrece la opción de deshacer ese cambio. Además, puede hacer clic derecho en las marcas rojas y azules para encontrar la versión anterior en una ventana emergente.

Cuestiones relacionadas