2010-04-12 9 views
50

Deseo revertir los cambios realizados por una confirmación particular a un archivo dado solamente.Revertir cambios a un archivo en una confirmación

¿Puedo usar el comando git revert para eso?

¿Alguna otra manera simple de hacerlo?

+0

Duplicado de http://stackoverflow.com/questions/215718/reset-or-revert-a-specific-file-to-a-specific-revision-using-git/215768 – koppor

+0

Extraño ... por qué el cambio después de todos esos años? – VonC

Respuesta

90

La manera más limpia que he visto de esta manera se describe here

git show some_commit_sha1 -- some_file.c | git apply -R 

Similar a la respuesta de VonC pero utilizando git show y git apply.

+2

Boom! Tu eres el hombre. – yitznewton

+6

Bien hecho. La solución de script es excesiva para esto. ¿Por qué no puede haber solo git revert sha-1 filename? –

+0

Bueno, pero VonCs tampoco está mal. Con ambos hay algo que aprender cada día en git :) – hakre

18

git revert es para todos los contenidos de archivos dentro de un commit.

Para un solo archivo, puede script it:

#!/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 los git-shell-scripts utilidades de smtlaissezfaire)


Nota:

otra manera es described here si todavía tiene confirma tu modificación actual.

git checkout -- filename 

git checkout tiene algunas opciones para un archivo, modificando el archivo de la CABEZA, sobrescribiendo su cambio.


Dropped.on.Caprica menciones in the comments:

Usted puede agregar un alias a git para que pueda hacer git revert-file <hash> <file-loc> y tienen que ser revertida archivo específico.
Ver this gist.

[alias] 
    revert-file = !sh /home/some-user/git-file-revert.sh 
+0

Solo para agregar a la discusión aquí, puede agregar un alias a git para que pueda hacer 'git revert-file ' y se revertirá ese archivo específico. Me levanté de esta respuesta (aunque tuve que hacer un par de ediciones para que funcione correctamente). Puede encontrar una copia de mi '.gitconfig' y script editado aquí: https://gist.github.com/droppedoncaprica/5b67ec0021371a0ad438 –

+0

@ Dropped.on.Caprica buen punto. Lo he incluido en la respuesta para una mayor visibilidad. – VonC

+0

¡Gracias! Actualicé tu publicación un poco para adaptarla al uso correcto, ¡pero por lo demás, lo bueno! –

12

Me basta con utilizar la opción --no-commit a git-revert y luego eliminar los archivos que no desea Revertidas del índice antes de que finalmente lo comete. He aquí un ejemplo que muestra cómo revertir fácilmente sólo los cambios a Foo.c en el segundo más reciente comprometerse:

$ 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 

Los primeros git-reset "unstages" todos los archivos, por lo que podemos entonces volver a agregar sólo el archivo que quiero revertir El git-reset --hard final elimina los archivos revertidos restantes que no queremos conservar.

15

Suponiendo que está bien para cambiar la historia cometer, aquí hay un flujo de trabajo para revertir los cambios en un único archivo en una anterior comprometen:

Por ejemplo, que desea revertir los cambios en 1 archivo (badfile.txt) en comprometerse aaa222 :

aaa333 Good commit 
aaa222 Problem commit containing badfile.txt 
aaa111 Base commit 

Rebase en la base de cometer, corregir el problema comprometerse, & continuar.

1) Comience rebase interactivo:

git rebase -i aaa111 

2) Marcar el problema de confirmación 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 & modificar el commit:

git add badfile.txt 
git commit --amend 

5) terminar el rebase:

git rebase --continue 
+0

Solo quiero señalar que esto supone que puede editar el historial de git. Algunas respuestas anteriores crean un nuevo compromiso que invierte el cambio particular sin editar el historial, que no siempre es posible/permitido. – angularsen

+0

¡Esta solución fue mi elección y funcionó a la perfección! Rebase interactivo puede hacer mucha magia :) ¡Gracias! –

1

mucho más sencillo:

git reset HEAD^ path/to/file/to/revert 

continuación

git commit --amend 

y luego

git push -f 

el archivo se ha ido y confirma el hash, el mensaje, etc. es lo mismo.

+0

Para completar, ¿necesita un paso 'git checkout - path/to/file/to/revert'? Además, no es cierto que el hash sea el mismo después, ¿verdad? La última oración podría ser mejor así: "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". – Kevin

Cuestiones relacionadas