Pregunta Deshacer las modificaciones de copia de trabajo de un archivo en Git?


Después de la última confirmación, modifiqué un grupo de archivos en mi copia de trabajo, pero deseo deshacer los cambios en uno de esos archivos, como restablecerlo en el mismo estado que la confirmación más reciente.

Sin embargo, solo quiero deshacer los cambios de copia de trabajo de solo ese archivo solo, nada más.

¿Cómo puedo hacer eso?


1294
2018-03-28 05:09


origen


Respuestas:


Puedes usar

git checkout -- file

Puedes hacerlo sin el -- (como lo sugiere nimrodm), pero si el nombre del archivo se parece a una rama o etiqueta (u otro identificador de revisión), puede confundirse, por lo que -- es mejor.

También puede consultar 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

1786
2018-03-28 06:12



git checkout <commit> <filename>

Lo usé hoy porque me di cuenta de que mi favicon había sido sobrescrito hace unos commits cuando actualicé a drupal 6.10, así que tuve que recuperarlo. Aquí esta lo que hice:

git checkout 088ecd favicon.ico

115
2018-03-28 10:25



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 guardará ninguna copia de seguridad.


101
2018-03-28 05:55



Si su archivo ya está en etapas (sucede cuando se hace un git, etc. después de que se edita el archivo) para dejar de grabar sus cambios.

Utilizar

git reset HEAD <file>

Entonces

git checkout <file>

Si aún no está organizado, solo use

git checkout <file>

51
2017-07-03 05:46



Si desea deshacer los cambios de la confirmación anterior a ese único archivo, puede intentar esto:

git checkout branchname^ filename

Esto revisará el archivo como estaba antes de la última confirmación. Si quieres volver a hacer algunos commits más, utiliza branchname~n notación.


15
2018-03-28 05:25



Siempre me confundo con esto, así que aquí hay un caso de prueba de recordatorio; digamos que tenemos esto bash script para probar git:

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
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 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, lo hacemos git checkout, el resultado es este:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Si en cambio lo 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")

Entonces, en este caso, si los cambios no están en etapas, git reset no hace diferencia, mientras git checkout sobrescribe los cambios.


Ahora, digamos que el último cambio del guión anterior está organizado / almacenado en caché, es decir que también lo hicimos git add b.txt al final.

En este caso, 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, lo hacemos git checkout, el resultado es este:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Si en cambio lo 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")

Entonces, en este caso, si los cambios son en etapas, git reset básicamente hará cambios escalonados en cambios no git checkout sobrescribirá los cambios por completo.


7
2018-02-09 08:56



Restauro mis archivos usando la identificación de SHA, lo que hago es git checkout <sha hash id> <file name>


5
2018-05-22 20:39