git selective revertir cambios locales desde un archivo


En mi repositorio git que está rastreando un repositorio svn, he realizado varias ediciones en un solo archivo.

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

Quiero poder ver las diferencias en el archivo, descartar(revertir) los cambios que no quiero y conservar los cambios que quiero.

El

git add -i 

El comando parece tener una opción para hacer eso, pero no quiero escenificar esto todavía.

Author: p.campbell, 2009-07-10

6 answers

Puedes hacerlo directamente con git checkout -p. Ver La respuesta de Daniel Stutzbach más abajo.


Respuesta antigua (antes de que se introdujera checkout -p ):

Puedes hacerlo así:

git add -i

(seleccione los trozos que desea mantener)

git commit -m "tmp"

Ahora tiene un commit con solo los cambios que desea mantener, y el resto no está configurado.

git reset --hard HEAD

En este punto, los cambios no comprometidos se han descartado, por lo que tiene un directorio de trabajo limpio, con los cambios que quiero mantener el compromiso en la parte superior.

git reset --mixed HEAD^

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

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

 80
Author: Paolo Capriotti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:50

Creo que puedes hacerlo más simplemente con:

git checkout -p <optional filename(s)>

De 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.
 291
Author: Daniel Stutzbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-04 22:55:57

Puede ejecutar git diff en el archivo, guardar la diferencia resultante, editarla para eliminar los cambios que hace desea guardar, luego ejecutarla a través de patch -R para deshacer las diferencias restantes.

git diff file.txt >patch.tmp
# edit patch.tmp to remove the hunks you want to keep
patch -R <patch.tmp
 3
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-10 11:44:36

Parece que quieres

 git revert --no-commit $REVSISON 

Luego puede usar

 git diff --cached

Para ver qué cambio se hará antes del commit (ya que revertir es solo un commit en una dirección hacia adelante que replica la inversa de un cambio en el pasado)

Si estuviera con un repositorio Git puro, posiblemente podría, dependiendo de sus objetivos, utilizar rebase interactivo (git rebase -i) para volver a la confirmación que no le gustó y editar la confirmación retroactivamente para que los cambios que no le gustan nunca sucedieran, pero eso es generalmente solo para si SABES nunca querrás volver a verlo.

 2
Author: Kent Fredric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-11 09:33:11

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

Si los cambios están solo en su copia de trabajo, entonces la forma más fácil de hacerlo es preparar los cambios que desea mantener:

git add -i <file>

Luego deseche los cambios que no desea mantener consultando el índice versión:

git checkout -- <file>

Luego despeja los cambios si no quieres que estén preparados todavía:

git reset -- <file>

Esta receta solo revierte los cambios seleccionados en el archivo (o archivos que especifique) y no crea ninguna confirmación temporal que luego necesite revertirse.

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

git reset <commit_before_first_unwanted_change> -- <file>

Luego puede seguir la receta anterior de git add -i <file> para preparar esos los cambios que desea mantener, git checkout -- <file> para desechar los cambios no deseados y git reset -- <file> para 'eliminar' los cambios.

 1
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-10 15:43:47

Las opciones de la línea de comandos descritas en las respuestas aquí son útiles cuando el archivo está en un servidor al que estoy accediendo a través de un 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 eliminaron/agregaron/modificaron las cosas (respectivamente).

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

 0
Author: Abhishek Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-07 05:05:38