revertir - ver cambios en un archivo git
Deshacer modificaciones de copia de trabajo de un archivo en Git? (12)
Después de la última confirmación, modifiqué un montón de archivos en mi copia de trabajo, pero quiero deshacer los cambios en uno de esos archivos, al restablecerlo al mismo estado que la confirmación más reciente.
Sin embargo, solo quiero deshacer los cambios de copia de trabajo de solo un archivo, nada más con él.
¿Cómo puedo hacer eso?
Esta respuesta es para el comando necesario para anular cambios locales que se encuentran en varios archivos específicos en la misma o múltiples carpetas (o directorios). Esta respuesta aborda específicamente la pregunta donde un usuario tiene más de un archivo pero el usuario no desea deshacer todos los cambios locales:
si tiene uno o más archivos, podría aplicar el comando samne (
git checkout -- file
) a cada uno de esos archivos enumerando cada una de sus ubicaciones separadas por espacio como en:
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
Cuidado con el espacio abve entre name1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext
Para múltiples archivos en la misma carpeta:
Si necesita descartar los cambios para todos los archivos en un directorio determinado, use el proceso de pago de git de la siguiente manera:
git checkout -- name1/name2/*
El asterisco de lo anterior hace el truco de deshacer todos los archivos en esa ubicación bajo nombre1 / nombre2.
Y, de manera similar, lo siguiente puede deshacer los cambios en todos los archivos para varias carpetas:
git checkout -- name1/name2/* nameA/subFolder/*
de nuevo, tenga en cuenta el espacio entre nombre1 / nombre2 / * nombreA / subcarpeta / * en lo anterior.
Nota: nombre1, nombre2, nombreA, subcarpeta: todos estos nombres de carpetas de ejemplo indican la carpeta o el paquete donde pueden residir los archivos en cuestión.
Puedes usar
git checkout -- file
Puede hacerlo sin el --
(como lo sugiere nimrodm), pero si el nombre del archivo parece una rama o etiqueta (u otro identificador de revisión), puede confundirse, por lo que es mejor usarlo.
También puede revisar una versión particular de un archivo:
git checkout v1.2.3 -- file # tag v1.2.3
git checkout stable -- file # stable branch
git checkout origin/master -- file # upstream master
git checkout HEAD -- file # the version from the most recent commit
git checkout HEAD^ -- file # the version before the most recent commit
Restauré mis archivos usando la ID de SHA. Lo que hago es git checkout <sha hash id> <file name>
Si aún no ha presionado o compartido su compromiso:
git diff --stat HEAD^...HEAD | /
fgrep filename_snippet_to_revert | cut -d'' '' -f2 | xargs git checkout HEAD^ --
git commit -a --amend
Si solo desea deshacer los cambios de confirmación anteriores en ese único archivo, puede intentar esto:
git checkout branchname^ filename
Esto comprobará el archivo como estaba antes de la última confirmación. Si desea volver a realizar algunas confirmaciones más, use la notación de nombre de branchname~n
.
Si su archivo ya está almacenado (sucede cuando hace un git add, etc. después de editar el archivo), elimine los cambios en el escenario.
Utilizar
git reset HEAD <file>
Entonces
git checkout <file>
Si aún no está en escena, solo use
git checkout <file>
Si ya está confirmado, puede revertir el cambio para el archivo y confirmar nuevamente, y luego rechazar el nuevo compromiso con el último compromiso.
Siempre me confundo con esto, así que aquí hay un caso de prueba recordatorio; digamos que tenemos este script bash
para probar git
:
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email [email protected]
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt
En este punto, el cambio no se realiza en la memoria caché, por lo que el git status
es:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Si a partir de este punto, hacemos git checkout
, el resultado es este:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Si por el contrario hacemos git reset
, el resultado es:
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Por lo tanto, en este caso, si los cambios no están organizados, git reset
no hace ninguna diferencia, mientras que git checkout
sobrescribe los cambios.
Ahora, digamos que el último cambio del script anterior está en escena / en caché, es decir que también git add b.txt
al final.
En este caso, el git status
en este punto es:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
Si a partir de este punto, hacemos git checkout
, el resultado es este:
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
Si por el contrario hacemos git reset
, el resultado es:
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
Por lo tanto, en este caso, si los cambios se realizan por etapas, git reset
básicamente hará los cambios por etapas en cambios sin etapas, mientras que git checkout
sobrescribirá los cambios por completo.
Solo usa
git checkout filename
Esto reemplazará el nombre de archivo con la última versión de la rama actual.
ADVERTENCIA: sus cambios serán descartados, no se mantiene ninguna copia de seguridad.
git checkout <commit> <filename>
Utilicé esto hoy porque me di cuenta de que mi favicon había sido sobrescrito hace unos pocos confirmaciones cuando actualicé a drupal 6.10, así que tuve que recuperarlo. Aquí esta lo que hice:
git checkout 088ecd favicon.ico