Quiero revertir los cambios realizados por un commit particular a un archivo dado solamente.
¿Puedo usar el comando git revert para eso?
¿Alguna otra forma simple de hacerlo?
Quiero revertir los cambios realizados por un commit particular a un archivo dado solamente.
¿Puedo usar el comando git revert para eso?
¿Alguna otra forma simple de hacerlo?
Respuestas:
La forma más limpia que he visto de hacer esto se describe aquí.
git show some_commit_sha1 -- some_file.c | git apply -R
Similar a la respuesta de VonC pero usando git show
y git apply
.
fatal: unrecognized input
-3
bandera para que git solicite la fusión tripartita cuando falla el parche, ya que generalmente estoy corrigiendo un cambio un poco en el tiempo.
some_file.c
incluir la ruta al archivo si hay uno; de lo contrario, no parcheará nada en silencio :)
Suponiendo que está bien cambiar el historial de confirmación, aquí hay un flujo de trabajo para revertir los cambios en un solo archivo en una confirmación anterior:
Por ejemplo, desea revertir los cambios en 1 archivo ( badfile.txt
) en commit aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Rebase en la confirmación de la base, corrija la confirmación del problema y continúe.
1) Iniciar rebase interactivo:
git rebase -i aaa111
2) Marque la confirmación del problema para editar en el editor cambiando pick
a e
(para editar):
e aaa222
pick aaa333
3) Revertir los cambios en el archivo incorrecto:
git show -- badfile.txt | git apply -R
4) Agregue los cambios y modifique la confirmación:
git add badfile.txt
git commit --amend
5) Termina el rebase:
git rebase --continue
edit
no se mostraban como modificados. Pero git show -- badfile.txt | git apply -R
dieron la respuesta que necesitaba <3
git revert
es para todo el contenido del archivo dentro de un commit.
Para un solo archivo, puede escribirlo :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(De las utilidades git-shell-scripts de smtlaissezfaire )
Nota:
aquí se describe otra forma si aún no ha confirmado su modificación actual.
git checkout -- filename
git checkout
tiene algunas opciones para un archivo, modificando el archivo desde HEAD, sobrescribiendo su cambio.
Dropped.on.Caprica menciona en los comentarios :
Puede agregar un alias a git para que pueda hacer
git revert-file <hash> <file-loc>
y revertir ese archivo específico.
Ver esta esencia .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
y revertir ese archivo específico. Levanté esta respuesta (aunque tuve que hacer un par de ediciones para que funcione correctamente). Puede encontrar una copia de mi .gitconfig
script editado aquí: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
Simplemente usaría la --no-commit
opción git-revert
y luego eliminaría los archivos que no desea revertir del índice antes de finalmente confirmarlo. Aquí hay un ejemplo que muestra cómo revertir fácilmente solo los cambios a foo.c en la segunda confirmación más reciente:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
El primero git-reset
"desestabiliza" todos los archivos, para que luego podamos volver a agregar solo el archivo que queremos revertir. La final git-reset --hard
elimina los reversos de archivos restantes que no queremos conservar.
Mucho más simple:
git reset HEAD^ path/to/file/to/revert
luego
git commit --amend
y entonces
git push -f
el archivo se ha ido y confirmar hash, mensaje, etc. es lo mismo.
git checkout -- path/to/file/to/revert
paso? Además, no es cierto que el hash sea el mismo después, ¿verdad? La última oración podría ser mejor como algo así como: "El resultado es que la última confirmación se reemplaza por una nueva que solo difiere en que no contiene los cambios en el archivo revertido".
git reset HEAD^ path/to/file/to/revert/in/commit
El comando anterior sacará el archivo de la confirmación, pero se reflejará en git status
.
git checkout path/to/file/to/revert/in/commit
El comando anterior revertirá los cambios (como resultado, obtendrá el mismo archivo que HEAD).
git commit
(Pase --amend
para enmendar el compromiso).
git push
Con esto, el archivo que ya está en el commit se elimina y se revierte.
Los pasos anteriores se deben seguir desde la rama donde se realiza la confirmación.
Puedes seguir este procedimiento:
git revert -n <*commit*>
( -n
revierte todos los cambios pero no los confirma)git add <*filename*>
(nombre de los archivos que desea revertir y confirmar)git commit -m 'reverted message'
(agregue un mensaje para revertir)Si desea restablecer los cambios en un archivo desde su última confirmación, esto es lo que generalmente uso. Creo que esta es la solución más simple.
Tenga en cuenta que el archivo se agregará al área de preparación.
git checkout <prev_commit_hash> -- <path_to_your_file>
Espero eso ayude :)