file cambios - Deshacer modificaciones de copia de trabajo de un archivo en Git?




ignorar commit (11)

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?


Answers

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

Para mi solo esta funciono

git checkout -p filename


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.


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>

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.


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

Si ya está confirmado, puede revertir el cambio para el archivo y confirmar nuevamente, y luego rechazar el nuevo compromiso con el último compromiso.


Restauré mis archivos usando la ID de SHA. Lo que hago es git checkout <sha hash id> <file name>


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

Esto es lo que siempre uso:

git clean -fdx

Para un proyecto muy grande es posible que desee ejecutarlo un par de veces.







git file version-control dvcs undo