¿Es posible revertir un solo archivo o ciertos cambios en un archivo en confirmación de múltiples archivos?
Historia completa cometí un montón de archivos. Una serie de confirmaciones posteriores, alguien que permanecerá sin nombre (JACK !!!) copió un archivo en su repositorio y confirmó varios archivos, sobrescribiendo algunos de los cambios que hice. Quiero revertir el único archivo que se golpeó o mejor aún, entrar y revertir dos cambios en ese archivo. Esto tendrá que ser una confirmación de reversión separada, ya que fue extraída y empujada.
--3way
resultados en conflictos de fusión en lugar de no aplicar parches.Respuestas:
Puede revertir la confirmación sin crear una nueva agregando la opción '--no-commit'. Esto deja todos los archivos revertidos en el área de preparación. A partir de ahí, realizaría un reinicio por software y agregaría los cambios que realmente quería. Para un ejemplo de flujo de trabajo:
fuente
git add -p
iniciar una sesión interactiva que le permite agregar selectivamente fragmentos de archivos, en lugar de archivos completos. (También haygit reset -p
cambios selectivamente en el escenario. Es bueno saberlo, pero probablemente no lo que quieres en este escenario.)revert
,reset
,stash -p
(escondite "se cancela que yo no quiero hacer actualy"),add
el resto,commit
Puede aplicar interactivamente la versión anterior de un archivo con el
checkout
comandoPor ejemplo, si sabe
COMMIT
dónde se eliminó el código para volver a agregar, puede ejecutar el siguiente comando:Git le pedirá que vuelva a agregar los trozos que faltan en la versión actual del archivo. Puede usar
e
para crear un parche del cambio antes de aplicarlo nuevamente.fuente
git checkout -p path/to/file
Puede verificar manualmente el contenido antiguo y bueno de los archivos que desea revertir usando
git checkout
. Por ejemplo, si desea volvermy-important-file
a la versión que estaba en la versiónabc123
, puede hacerAhora tiene el contenido anterior de la parte
my-important-file
posterior, e incluso puede editarlos si lo desea, y comprometerse como de costumbre para realizar una confirmación que revertirá los cambios que realizó. Si solo desea revertir algunas partes de su compromiso, usegit add -p
para seleccionar solo unos pocos trozos del parche que está comprometiendo.fuente
revert
, solo está recuperando una versión anterior del archivo. Un correctorevert
eliminará las modificaciones de confirmación incorrecta dentro del archivo, incluso si se ha modificado varias veces desde esa confirmación incorrecta, y no desea perder esas modificaciones.git checkout -p
.Encontré una manera de hacer esto en la lista de correo de Git:
Fuente: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
Variaciones
Ese comando falla (sin causar cambios) si el parche no se aplica limpiamente, pero en
--3way
su lugar obtiene conflictos que luego puede resolver manualmente (en este caso, la respuesta de Casey podría ser más práctica):También puede usar esto para revertir parcialmente confirmaciones múltiples, por ejemplo:
para revertir archivos con cambios que coincidan
<string>
en cualquier confirmación. Esto es exactamente lo que necesitaba en mi caso de uso (algunas confirmaciones separadas introdujeron cambios similares en diferentes archivos, junto con cambios en otros archivos de formas no relacionadas que no quería revertir).Si ha
diff.noprefix=true
configurado en su,~/.gitconfig
entonces necesita agregar-p0
algit apply
comando, por ejemplofuente
git show ... > foo.txt
(2) editarfoo.txt
para eliminar las diferencias que no quería revertir (3)git apply --reverse foo.txt
para revertir las diferencias que todavía figuran en la listafoo.txt
.