sobrescritos - ¿Cómo puedo revertir todos los cambios locales en el proyecto administrado por Git al estado anterior?
revertir cambios en un archivo git (12)
Re-clonar
GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
- ✅ Borra los compromisos locales, no empujados
- ✅ Revierte los cambios realizados en archivos rastreados
- ✅ Restaura los archivos rastreados que eliminó
- ✅ Borra los archivos /
.gitignore
listados en.gitignore
(como los archivos de compilación) - ✅ Borra los archivos / direcciones que no son rastreados y no están en
.gitignore
- 😀 No olvidarás este enfoque.
- 😔 Desperdicio de ancho de banda
A continuación hay otros comandos que olvido diariamente.
Limpiar y reiniciar
git clean -f -d -x
git reset --hard
- ❌ Borra los compromisos locales, no empujados
- ✅ Revierte los cambios realizados en archivos rastreados
- ✅ Restaura los archivos rastreados que eliminó
- ✅ Borra los archivos /
.gitignore
listados en.gitignore
(como los archivos de compilación) - ✅ Borra los archivos / direcciones que no son rastreados y no están en
.gitignore
Limpiar
git clean -f -d -x
- ❌ Borra los compromisos locales, no empujados
- ❌ Revierte los cambios realizados en archivos rastreados
- ❌ Restaura los archivos rastreados que eliminó
- ✅ Borra los archivos /
.gitignore
listados en.gitignore
(como los archivos de compilación) - ✅ Borra los archivos / direcciones que no son rastreados y no están en
.gitignore
Reiniciar
git reset --hard
- ❌ Borra los compromisos locales, no empujados
- ✅ Revierte los cambios realizados en archivos rastreados
- ✅ Restaura los archivos rastreados que eliminó
- ❌ Borra los archivos /
.gitignore
listados en.gitignore
(como los archivos de compilación) - ❌ Borra los archivos / direcciones que no son rastreados y no están en
.gitignore
Notas
Caso de prueba para confirmar todo lo anterior (use bash o sh):
mkdir project
cd project
git init
echo ''*.built'' > .gitignore
echo ''CODE'' > a.sourceCode
mkdir b
echo ''CODE'' > b/b.sourceCode
cp -r b c
git add .
git commit -m ''Initial checkin''
echo ''NEW FEATURE'' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo ''CODE'' > ''d.sourceCode''
Ver también
-
git revert
para hacer nuevas confirmaciones que deshacer confirmaciones previas -
git checkout
para retroceder en el tiempo a confirmaciones previas (puede requerir ejecutar primero los comandos anteriores) -
git stash
igual quegit reset
arriba, pero puedes deshacerlo
Tengo un proyecto en el que ejecuté git init
. Después de varias confirmaciones, hice el git status
que me dijo que todo estaba actualizado y que no había cambios locales.
Luego hice varios cambios consecutivos y me di cuenta de que quería deshacerme de todo y volver a mi estado original. ¿Este comando lo hará por mí?
git reset --hard HEAD
Busqué un problema similar,
Quería tirar los compromisos locales:
- clonado el repositorio (clon git)
- cambiado a la rama dev (git checkout dev)
- hizo pocos commit (git commit -m "commit 1")
- pero decidió deshacerse de estos compromisos locales para volver a remoto (origen / dev)
Así hizo el siguiente:
git reset --hard origin/dev
Comprobar:
git status
On branch dev
Your branch is up-to-date with ''origin/dev''.
nothing to commit, working tree clean
ahora se pierden las confirmaciones locales, volviendo al estado clonado inicial, punto 1 anterior.
Después de leer un montón de respuestas y probarlas, he encontrado varios casos de borde que significan que a veces no limpian completamente la copia de trabajo.
Aquí está mi script de bash actual para hacerlo, que funciona todo el tiempo.
#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD
Ejecutar desde el directorio raíz de la copia de trabajo.
Es posible que no necesariamente desee / necesite guardar su trabajo / archivos en su directorio de trabajo, sino simplemente deshacerse de ellos por completo. El comando git clean
hará esto por ti.
Algunos casos de uso comunes para hacer esto serían eliminar el cruft generado por fusiones o herramientas externas o eliminar otros archivos para que pueda ejecutar una compilación limpia.
Tenga en cuenta que querrá ser muy cauteloso con este comando, ya que está diseñado para eliminar archivos de su directorio de trabajo local que NO ESTÁN SEGUIDOS. Si de repente cambia de opinión después de ejecutar este comando, no hay vuelta atrás para ver el contenido de los archivos que se eliminaron. Una alternativa más segura es ejecutar.
git stash --all
que eliminará todo, pero guardarlo todo en un escondite. Este alijo puede ser utilizado más tarde.
Sin embargo, si realmente QUIERES eliminar todos los archivos y limpiar tu directorio de trabajo, debes ejecutar
git clean -f -d
Esto eliminará todos los archivos y también los subdirectorios que no tengan ningún elemento como resultado del comando. Una cosa inteligente que hacer antes de ejecutar el comando git clean -f -d
es ejecutar
git clean -f -d -n
que le mostrará una vista previa de lo que se eliminará después de ejecutar git clean -f -d
Así que aquí hay un resumen de sus opciones, desde las más agresivas a las menos agresivas.
Opción 1 : eliminar todos los archivos localmente (los más agresivos)
git clean -f -d
Opción 2 : Vista previa del impacto anterior (Vista previa más agresiva)
git clean -f -d -n
Opción 3 : guardar todos los archivos (menos agresivo)
`git stash --all`
Intente esto para revertir todos los cambios no confirmados en la sucursal local
$ git reset --hard HEAD
Pero si ves un error como este:
fatal: Unable to create ''/directory/for/your/project/.git/index.lock'': File exists.
Puede navegar a la carpeta ''.git'' y luego eliminar el archivo index.lock:
$ cd /directory/for/your/project/.git/
$ rm index.lock
Finalmente, ejecute de nuevo el comando:
$ git reset --hard HEAD
Me encontré con un problema similar. La solución es utilizar el git log
para buscar qué versión de la confirmación local es diferente de la remota. (Por ejemplo, la versión es 3c74a11530697214cbcc4b7b98bf7a65952a34ec
).
Luego use git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec
para revertir el cambio.
Mira en git-reflog. Enumera todos los estados que recuerda (el valor predeterminado es 30 días), y simplemente puede retirar el que desee. Por ejemplo:
$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo ''foo'' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
Nota: También es posible que desee ejecutar
git clean -fd
como
git reset --hard
no eliminará los archivos sin seguimiento, mientras que git-clean eliminará cualquier archivo del directorio raíz seguido que no esté bajo el seguimiento de git. ADVERTENCIA - ¡TENGA CUIDADO CON ESTO! Es útil ejecutar primero una ejecución en seco con git-clean, para ver qué se eliminará.
Esto también es especialmente útil cuando aparece el mensaje de error.
~"performing this command will cause an un-tracked file to be overwritten"
Lo que puede ocurrir al hacer varias cosas, una de ellas es actualizar una copia de trabajo cuando tanto usted como su amigo han agregado un nuevo archivo con el mismo nombre, pero primero lo ha puesto en el control de código fuente, y no le importa eliminar su copia sin seguimiento. .
En esta situación, hacer una ejecución en seco también ayudará a mostrarle una lista de archivos que se sobrescribirían.
PELIGRO A CONTINUACIÓN: (lea los comentarios. La ejecución del comando propuesto en mi respuesta puede eliminar más de lo que desea)
para eliminar por completo todos los archivos, incluidos los directorios que tuve que ejecutar
git clean -f -d
Si desea revertir los cambios realizados en su copia de trabajo, haga lo siguiente:
git checkout .
Si desea revertir los cambios realizados en el índice (es decir, que ha agregado), haga esto. ¡Advertencia, esto restablecerá todos tus compromisos sin apilar para dominar! :
git reset
Si desea revertir un cambio que haya cometido, haga lo siguiente:
git revert <commit 1> <commit 2>
Si desea eliminar archivos sin seguimiento (por ejemplo, archivos nuevos, archivos generados):
git clean -f
O directorios sin seguimiento (por ejemplo, directorios nuevos o generados automáticamente):
git clean -fd
Si desea revertir todos los cambios Y estar actualizado con el maestro remoto actual (por ejemplo, encuentra que el HEAD maestro ha avanzado desde que se bifurcó y su empuje está siendo "rechazado") puede usar
git fetch # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.
simplemente di
git stash
eliminará todos tus chages locales. y también puedes usar más tarde diciendo
git stash apply