volver ver revertir modificados ignorar eliminar deshacer cambios archivos archivo anterior git file version-control dvcs undo

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.


Para mi solo esta funciono

git checkout -p filename


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.


He hecho a través de Git Bash:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Estado de Git. [Así que hemos visto un archivo wad modificado.]
  2. git checkout - index.html [he cambiado en el archivo index.html:
  3. Estado git [ahora esos cambios fueron eliminados]


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