Accidentalmente cometí los archivos incorrectos en Git , pero aún no he enviado la confirmación al servidor.
¿Cómo puedo deshacer esas confirmaciones del repositorio local?
git
version-control
git-commit
undo
pre-commit
Peter Mortensen
fuente
fuente
git undo
, Eso es. Entonces, la reputación que tiene Git por manejar los errores cometidos por nosotros, simples mortales, desaparece. Implemente presionando el estado actual en una pila git antes de ejecutar cualquiergit
comando. Afectaría el rendimiento, por lo que sería mejor agregar un indicador de configuración para habilitarlo.alias
función de Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliasesgit reflog
ya está cerca de lo que describe, pero le da al usuario más control sobre lo que se debe (des) hacer. Pero, por favor, no, "deshacer" no funciona de la misma manera en todas partes, y la gente esperaría muchas cosas diferentes para lograr la función. ¿Deshacer la última confirmación? ¿Deshacer la última acción? Si la última acción fue un empuje, ¿deshacer cómo exactamente (restablecer y empujar) o (revertir y empujar)?Respuestas:
Deshacer un commit y rehacer
git status
, por lo que deberá agréguelos nuevamente antes de comprometerse). Si solo desea agregar más cambios a la confirmación anterior, o cambiar el mensaje de confirmación 1 , puede usargit reset --soft HEAD~
en su lugar, que es comogit reset HEAD~
2 pero deja los cambios existentes en escena.git add
todo lo que quieras incluir en tu nueva confirmación.reset
copiado la vieja cabeza a.git/ORIG_HEAD
;commit
with-c ORIG_HEAD
abrirá un editor, que inicialmente contiene el mensaje de registro del antiguo commit y le permite editarlo. Si no necesita editar el mensaje, puede usar la-C
opción.Sin embargo, tenga en cuenta que si agregó nuevos cambios al índice, el uso
commit --amend
los agregará a su confirmación anterior.Si el código ya está insertado en su servidor y tiene permisos para sobrescribir el historial (rebase), entonces:
También puedes ver esta respuesta:
¿Cómo puedo mover HEAD a una ubicación anterior? (Cabeza separada) y deshacer confirmaciones
La respuesta anterior le mostrará
git reflog,
cuál se utiliza para averiguar qué es el SHA-1, que desea revertir. Una vez que encuentre el punto en el que desea deshacer, use la secuencia de comandos como se explicó anteriormente.1 Tenga en cuenta, sin embargo, que no necesita restablecer una confirmación anterior si solo cometió un error en su mensaje de confirmación . La opción más fácil es
git reset
(desestabilizar cualquier cambio que haya realizado desde entonces) y luegogit commit --amend
, que abrirá su editor de mensajes de confirmación predeterminado rellenado previamente con el último mensaje de confirmación.2
HEAD~
es lo mismo queHEAD~1
. Además, vea ¿Cuál es la CABEZA en git? . Es útil si desea deshacer múltiples confirmaciones.fuente
git checkout theRightBranch
con todas las etapas de cambios. Como solo tenía que hacer.git reset --soft HEAD^
eso deberá usarlogit reset --soft HEAD~1
. El ^ es un carácter de continuación en DOS, por lo que no funcionará correctamente. Además,--soft
es el valor predeterminado, por lo que puede omitirlo si lo desea y simplemente decirlogit reset HEAD~1
.zsh: no matches found: HEAD^
- necesita escapar ^ es decirgit reset --soft HEAD\^
git commit -a
se emitió cuando-a
debería haberse dejado de lado. En ese caso, es mejor no omitir--soft
(lo que dará como resultado--mixed
cuál es el valor predeterminado) y luego puede reestablecer los cambios que pretendía cometer.git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…]
Deshacer un commit es un poco aterrador si no sabes cómo funciona. Pero en realidad es increíblemente fácil si lo entiendes.
Digamos que tiene esto, donde C es su CABEZA y (F) es el estado de sus archivos.
Desea destruir nuclearmente C y nunca volver a verlo y perder todos los cambios en los archivos modificados localmente . Tu hiciste esto:
El resultado es:
Ahora B es la CABEZA. Debido a que usó
--hard
, sus archivos se restablecen a su estado en commit B.Ah, pero supongamos que cometer C no fue un desastre, sino un poco extraño. Desea deshacer la confirmación, pero mantenga los cambios para editar un poco antes de realizar una confirmación mejor. Comenzando de nuevo desde aquí, con C como su CABEZA:
Puedes hacer esto, dejando de lado
--hard
:En este caso el resultado es:
En ambos casos, HEAD es solo un puntero a la última confirmación. Cuando haces un
git reset HEAD~1
, le dices a Git que mueva el puntero HEAD hacia atrás una confirmación. Pero (a menos que lo use--hard
) deja sus archivos como estaban. Así que ahoragit status
muestra los cambios que has registrado en C. ¡No has perdido nada!Para el toque más ligero, incluso puede deshacer su confirmación pero dejar sus archivos y su índice :
Esto no solo deja sus archivos solos, sino que también deja solo su índice . Cuando lo haga
git status
, verá que los mismos archivos están en el índice que antes. De hecho, justo después de este comando, podría hacergit commit
y estaría rehaciendo la misma confirmación que acaba de tener.Una cosa más: ¿ Supongamos que destruye un commit como en el primer ejemplo, pero luego descubre que lo necesitaba después de todo ? Mala suerte, ¿verdad?
No, todavía hay una manera de recuperarlo. Escriba
git reflog
y verá una lista de commits (parciales) (es decir, hashes) en los que se ha movido. Encuentre el commit que destruyó y haga lo siguiente:Ahora has resucitado ese compromiso. Los commits en realidad no se destruyen en Git durante unos 90 días, por lo que generalmente puede regresar y rescatar uno del que no quiso deshacerse.
fuente
git reset --hard~1
apuntará la rama maestra a la última confirmación dentro de la rama de característica. En este caso, se debe usar la ID de confirmación específica en lugar del comando relativo.--hard
pero no me di cuenta de que todos mis cambios no organizados en mi árbol de trabajo también se ven afectados. Iba a confirmar estos archivos como parte de una confirmación posterior. Ahora parece imposible recuperar estos archivos; incluso probé la solución sobre la que publicaste,reflog
pero esto no restauró los cambios previamente no organizados.Hay dos formas de "deshacer" su último commit, dependiendo de si ya ha hecho público su commit (enviado a su repositorio remoto):
Cómo deshacer una confirmación local
Digamos que me comprometí localmente, pero ahora quiero eliminar ese compromiso.
Para restaurar todo a la forma en que estaba antes de la última confirmación, necesitamos
reset
confirmar antesHEAD
:Ahora
git log
mostrará que nuestro último commit ha sido eliminado.Cómo deshacer un compromiso público
Si ya ha hecho públicos sus commits, querrá crear un nuevo commit que "revertirá" los cambios que realizó en su commit anterior (HEAD actual).
Tus cambios ahora se revertirán y estarán listos para que los confirmes:
Para obtener más información, consulte Conceptos básicos de Git: deshacer cosas .
fuente
git revert HEAD^
no es lo anterior, es lo anterior de lo anterior. Lo hice:git revert HEAD
y luegoAgregue / elimine archivos para obtener las cosas de la manera que desee:
Luego modifique el commit:
La confirmación errónea anterior se editará para reflejar el nuevo estado del índice; en otras palabras, será como si nunca hubiera cometido el error en primer lugar.
Tenga en cuenta que solo debe hacer esto si aún no ha presionado. Si ha presionado, solo tendrá que cometer una solución normalmente.
fuente
git rm --cached
para mantener los archivos en el sistema de archivos y solo elimínelos del índice git!o
Advertencia: El comando anterior eliminará permanentemente las modificaciones a los
.java
archivos (y cualquier otro archivo) que desea confirmar.El
hard reset
toHEAD-1
establecerá su copia de trabajo al estado de la confirmación antes de su confirmación incorrecta.fuente
git commit -a -m ""
ogit commit -am ""
naturalmente! :]git stash
, entoncesgit stash pop
Para cambiar la última confirmación
Reemplace los archivos en el índice:
Luego, si se trata de una rama privada, modifique la confirmación:
O, si se trata de una rama compartida, realice una nueva confirmación:
( Para cambiar una confirmación anterior , use la impresionante rebase interactiva ).
ProTip ™: agregue
*.class
a un gitignore para evitar que esto vuelva a ocurrirPara revertir una confirmación
Enmendar un commit es la solución ideal si necesita cambiar el último commit, pero es una solución más general
reset
.Puede restablecer Git a cualquier confirmación con:
¿Dónde
N
está el número de confirmaciones antesHEAD
y@~
restablece a la confirmación anterior.Entonces, en lugar de modificar la confirmación, puede usar:
Consulte
git help reset
, específicamente las secciones sobre--soft
--mixed
y--hard
, para una mejor comprensión de lo que esto hace.Reloguear
Si comete un error, siempre puede usar el registro para buscar confirmaciones descartadas:
fuente
git revert
trata de un comando separado, que básicamente 'restablece' un solo mensaje.Uso
git revert <commit-id>
.Para obtener la ID de confirmación, solo use
git log
.fuente
git revert commit-id
trabajado como un encanto. Por supuesto, entonces deberá impulsar sus cambios.git cherry-pick <<erroneous-commit-sha>>
@astronomerdave. De, Sr. Casi 2 años tarde a la fiesta.Si está planeando deshacer por completo una confirmación local, lo que sea que haya cambiado lo hizo en la confirmación, y si no le preocupa nada de eso, simplemente ejecute el siguiente comando.
(Este comando ignorará toda su confirmación y sus cambios se perderán por completo de su árbol de trabajo local). Si desea deshacer su confirmación, pero desea que sus cambios en el área de preparación (antes de la confirmación como después
git add
) realice el siguiente comando.Ahora sus archivos comprometidos entran en el área de preparación. Suponga que si desea eclipsar los archivos, porque necesita editar algún contenido incorrecto, entonces ejecute el siguiente comando
Ahora los archivos comprometidos provienen del área preparada al área no preparada. Ahora los archivos están listos para editar, así que sea lo que sea que cambie, desea editarlo y agregarlo y hacer una confirmación nueva / nueva.
Más
fuente
Si tiene instalado Git Extras , puede ejecutar
git undo
para deshacer la última confirmación.git undo 3
deshacerá los últimos tres commits.fuente
Quería deshacer las últimas cinco confirmaciones en nuestro repositorio compartido. Busqué la identificación de revisión a la que quería retroceder. Luego escribí lo siguiente.
fuente
Prefiero usar
git rebase -i
para este trabajo, porque aparece una buena lista donde puedo elegir los commits para eliminar. Puede que no sea tan directo como algunas otras respuestas aquí, pero se siente bien .Elija cuántas confirmaciones desea enumerar, luego invoque de esta manera (para alistar las últimas tres)
Lista de muestra
Luego, Git eliminará los commits para cualquier línea que elimine.
fuente
Cómo arreglar el commit local anterior
Use git-gui (o similar) para realizar a
git commit --amend
. Desde la GUI puede agregar o eliminar archivos individuales de la confirmación. También puede modificar el mensaje de confirmación.Cómo deshacer la confirmación local anterior
Simplemente restablezca su sucursal a la ubicación anterior (por ejemplo, usando
gitk
ogit rebase
). Luego vuelva a aplicar sus cambios desde una copia guardada. Después de la recolección de basura en su repositorio local, será como si la confirmación no deseada nunca sucediera. Para hacer todo eso en un solo comando, usegit reset HEAD~1
.Palabra de advertencia : el uso descuidado de
git reset
es una buena manera de llevar su copia de trabajo a un estado confuso. Recomiendo que los novatos de Git eviten esto si pueden.Cómo deshacer un compromiso público
Realice una selección de cereza inversa ( git-revert ) para deshacer los cambios.
Si aún no ha realizado otros cambios en su sucursal, simplemente puede hacer ...
Luego empuje su rama actualizada al repositorio compartido.
El historial de confirmaciones mostrará ambas confirmaciones, por separado .
Avanzado: corrección de la rama privada en el repositorio público
Esto puede ser peligroso: asegúrese de tener una copia local de la rama para repintar.
También tenga en cuenta: no desea hacer esto si alguien más puede estar trabajando en la sucursal.
Limpia tu sucursal localmente y repórtala ...
En el caso normal, probablemente no tenga que preocuparse de que su historial de confirmación de sucursal privada sea prístino. Simplemente presione una confirmación de seguimiento (consulte 'Cómo deshacer una confirmación pública' más arriba), y más tarde, haga una combinación de squash para ocultar el historial.
fuente
gitk --all $(git reflog | cut -c1-7)&
puede ser útil para encontrar la revisión anterior si desea deshacer una confirmación '--amend'.git reset
git push origin (branch_name) --force
Si desea deshacerlo permanentemente y ha clonado algún repositorio
El id de confirmación puede ser visto por
Entonces puedes hacer -
fuente
git reset --hard
, pero si tiene que eliminar por última vez las últimas confirmaciones "n", especifique un SHASi ha cometido basura pero no ha presionado,
O
fuente
HEAD~1
usted podría usar el hash real como se muestra porgit log --stat
o porgit reflog
- útil cuando necesita 'deshacer' más de una confirmación.En SourceTree (GUI para GitHub), puede hacer clic derecho en el commit y hacer un 'Reverse Commit'. Esto debería deshacer sus cambios.
En la terminal:
Alternativamente, puede usar:
O:
fuente
Un solo comando:
¡Funciona muy bien para deshacer el último compromiso local!
fuente
Simplemente reinícielo haciendo el siguiente comando usando
git
:Explicar: qué
git reset
hace, es básicamentereset
a cualquier confirmación a la que le gustaría volver, luego, si lo combina con la--soft
clave, volverá, pero mantendrá los cambios en sus archivos, para que pueda volver al escenario con el que se acaba de agregar el archivo,HEAD
es el encabezado de la rama y si se combina con~1
(en este caso también se usaHEAD^
), solo se devolverá una confirmación que es lo que desea ...Creo los pasos en la imagen a continuación con más detalles para usted, incluidos todos los pasos que pueden ocurrir en situaciones reales y la confirmación del código:
fuente
¿Cómo deshacer la última confirmación de Git?
Para restaurar todo a la forma en que estaba antes de la última confirmación, necesitamos restablecer la confirmación antes de HEAD.
Si no desea conservar los cambios que realizó:
Si desea mantener sus cambios:
Ahora revise su registro de git. Mostrará que nuestro último commit ha sido eliminado.
fuente
"Restablece el árbol de trabajo a la última confirmación"
"Limpiar archivos desconocidos del árbol de trabajo"
ver - Referencia rápida de Git
NOTA: Este comando eliminará su confirmación anterior, ¡así que úselo con precaución!
git reset --hard
Es más seguro.fuente
Use reflog para encontrar un estado correcto
REFLOGAR ANTES DE RESTABLECER
Seleccione el reflog correcto (f3cb6e2 en mi caso) y escriba
Después de eso, el repositorio HEAD se restablecerá a ese HEADid LOG DESPUÉS DE RESET
Finalmente el reflog se parece a la imagen de abajo
REFLOG FINAL
fuente
Primer intento:
Le mostrará todas las acciones posibles que ha realizado en su repositorio, por ejemplo, commit, merge, pull, etc.
Entonces hazlo:
fuente
Deshacer la última confirmación:
git reset --soft HEAD^
ogit reset --soft HEAD~
Esto deshacerá la última confirmación.
Aquí
--soft
significa restablecer a la puesta en escena.HEAD~
oHEAD^
significa moverse para comprometerse antes de HEAD.Reemplace la última confirmación por una nueva confirmación:
Reemplazará la última confirmación con la nueva confirmación.
fuente
De otra manera:
Verifique la rama que desea revertir, luego restablezca su copia de trabajo local de nuevo a la confirmación de que desea ser la última en el servidor remoto (todo después de que se vaya adiós). Para hacer esto, en SourceTree hice clic derecho en y seleccioné "Restablecer BRANCHNAME a este commit".
Luego navegue al directorio local de su repositorio y ejecute este comando:
Esto borrará todas las confirmaciones después de la actual en su repositorio local, pero solo para esa rama.
fuente
Escriba
git log
y encuentre el último código hash de confirmación y luego ingrese:fuente
En mi caso, accidentalmente cometí algunos archivos que no quería. Entonces hice lo siguiente y funcionó:
Verifique los resultados con gitk o git log --stat
fuente
Simple, ejecuta esto en tu línea de comando:
fuente
Hay muchas formas de hacerlo:
Comando Git para deshacer la última confirmación / confirmaciones anteriores:
Advertencia: No use --hard si no sabe lo que está haciendo. --hard es demasiado peligroso y podría eliminar tus archivos.
El comando básico para revertir el commit en Git es:
o
ID DE COMPROMISO : ID para el compromiso
n: es el número de últimas confirmaciones que desea revertir
Puede obtener la identificación de confirmación como se muestra a continuación:
donde d81d3f1 y be20eb8 son id de confirmación.
Ahora veamos algunos casos:
Supongamos que desea revertir la última confirmación 'd81d3f1'. Aquí hay dos opciones:
o
Supongamos que desea revertir la confirmación 'be20eb8':
Para obtener información más detallada, puede consultar y probar otros comandos también para restablecer la cabeza a un estado específico:
fuente
git reset --hard HEAD~1
es muy peligroso ! Esto no solo 'cancelará la última confirmación', sino que revertirá el repositorio completamente de nuevo a la confirmación anterior. ¡Así que PERDERÁS todos los cambios comprometidos en la última confirmación!git push -f <remote> HEAD@{1}:<branch>
Para un compromiso local
o si no recuerda exactamente en qué confirmación se encuentra, puede usar
Para un compromiso empujado
Se está utilizando la forma correcta de eliminar archivos del historial del repositorio
git filter-branch
. Es decir,Pero te recomiendo que uses este comando con cuidado. Lea más en git-filter-branch (1) Página del manual .
fuente
Hay dos escenarios principales.
Aún no has presionado el commit
Si el problema fueron los archivos adicionales que confirmó (y no desea que estén en el repositorio), puede eliminarlos usando
git rm
y luego confirmando con--amend
También puede eliminar directorios completos
-r
o incluso combinarlos con otros comandos BashDespués de eliminar los archivos, puede confirmar, con la opción --amend
Esto reescribirá su confirmación local reciente eliminando los archivos adicionales, por lo tanto, estos archivos nunca se enviarán en modo push y también serán eliminados de su repositorio local .git por GC.
Ya presionaste el commit
Puede aplicar la misma solución del otro escenario y luego hacerlo
git push
con la-f
opción, pero no se recomienda ya que sobrescribe el historial remoto con un cambio divergente (puede dañar su repositorio).En cambio, debe realizar la confirmación sin
--amend
(recuerde esto sobre -amend`: esa opción reescribe el historial en la última confirmación).fuente
Para restablecer la revisión anterior, eliminar permanentemente todos los cambios no confirmados:
fuente
--soft
para mantener sus cambios comouncommitted changes
,--hard
para bombardear la confirmación por completo y revertir en uno. Recuerde hacer tales operaciones solo en los cambios, que aún no se hayan presionado.git reset --hard
.git
almacena su contenido en su base de datos de objetos. Los contenidos almacenados solo se eliminan cuando se ejecuta la recolección de basura. Por lo tanto, es posible recuperar la última versión preparada de un archivo que no se preparó actualmente cuandogit reset --hard
se ejecutó (consulte las publicaciones vinculadas anteriormente para obtener más información).