¿Cómo deshago las confirmaciones locales más recientes en Git?

Yo accidentalmente cometió los archivos incorrectos a ir, pero aún no ha enviado la confirmación al servidor.

Cómo puedo deshacer esas confirmaciones del repositorio local?

preguntado el 29 de mayo de 09 a las 15:05

Antes de publicar una nueva respuesta, considere que ya hay más de 65 respuestas para esta pregunta. Asegúrese de que su respuesta contribuya con lo que no se encuentra entre las respuestas existentes. -

¿Sabes lo que necesita git? git undo, Eso es. Entonces, la reputación que tiene Git de manejar los errores cometidos por nosotros, simples mortales, desaparece. Implementar presionando el estado actual en una pila de git antes de ejecutar cualquier git mando. Afectaría el rendimiento, por lo que sería mejor agregar un indicador de configuración para habilitarlo. -

@YiminRong Eso se puede hacer con Git's alias característica: git-scm.com/book/en/v2/Git-Basics-Git-Alias -

@RomainValeri - De la misma manera, deshacer funciona en cualquier otro lugar. -

@YiminRong No lo creo. La gente seguiría buscando a tientas y deshaciendo cosas que no se pueden deshacer. Pero mas importante, git reflog ya está cerca de lo que describe, pero le da al usuario más control sobre lo que debe (des) hacer. Pero, por favor, no, "deshacer" no funciona igual en todas partes, y la gente esperar muchas cosas diferentes para que la función logre. ¿Deshacer la última confirmación? ¿Deshacer la última acción? Si la última acción fue un empujón, ¿deshacer cómo exactamente, (restablecer y empujar) o (revertir y empujar)? -

30 Respuestas

Deshacer una confirmación y rehacer

$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~                              # (1)
[ edit files as necessary ]                    # (2)
$ git add .                                    # (3)
$ git commit -c ORIG_HEAD                      # (4)
  1. Este comando es responsable de la deshacer. Deshará tu última confirmación mientras dejando intacto su árbol de trabajo (el estado de sus archivos en el disco). Deberá agregarlos nuevamente antes de poder confirmarlos nuevamente).

  2. Realice correcciones en los archivos del árbol de trabajo.

  3. git add cualquier cosa que desee incluir en su nueva confirmación.

  4. Confirme los cambios, reutilizando el mensaje de confirmación anterior. reset copió la vieja cabeza a .git/ORIG_HEAD; commit con -c ORIG_HEAD abrirá un editor, que inicialmente contiene el mensaje de registro de la confirmación anterior y le permite editarlo. Si no necesita editar el mensaje, puede utilizar el -C .

Alternativamente, para editar la confirmación anterior (o simplemente su mensaje de confirmación), commit --amend agregará cambios dentro del índice actual a la confirmación anterior.

Para eliminar (no revertir) una confirmación que se ha enviado al servidor, reescribiendo la historia con git push origin master --force es necesario.


OTRAS LECTURAS

¿Cómo puedo volver a mover HEAD a una ubicación anterior? (Cabeza separada) y Deshacer confirmaciones

La respuesta anterior te mostrará git reflog, que puede usar para determinar el SHA-1 para la confirmación a la que desea revertir. Una vez que tenga este valor, use la secuencia de comandos como se explicó anteriormente.


HEAD~ es el mismo que HEAD~1. El artículo ¿Qué es HEAD en git? es útil si desea deshacer el compromiso de varias confirmaciones.

Respondido el 21 de diciembre de 20 a las 16:12

Y si el compromiso fue en la rama incorrecta, puede git checkout theRightBranch con todos los cambios de etapas. Como solo tenía que hacer. - franco shearar

Si está trabajando en DOS, en lugar de git reset --soft HEAD^ necesitarás usar git reset --soft HEAD~1. El ^ es un carácter de continuación en DOS, por lo que no funcionará correctamente. También, --soft es el predeterminado, por lo que puede omitirlo si lo desea y simplemente decir git reset HEAD~1. - ryan lundy

Los usuarios de zsh pueden obtener: zsh: no matches found: HEAD^ - necesitas escapar ^ es decir git reset --soft HEAD\^ - tnajdek

La respuesta no es correcta si, digamos por accidente, git commit -a fue emitido cuando el -a debería haber quedado fuera. En cuyo caso, es mejor no omitir el --soft (que resultará en --mixed que es el predeterminado) y luego puede volver a programar los cambios que pretendía confirmar. - Dmansfield

En versiones más recientes de git HEAD~ puede ser reemplazado con @~. - ThomasW

Deshacer una confirmación da un poco de miedo si no sabes cómo funciona. Pero en realidad es increíblemente fácil si lo entiendes. Te mostraré las 4 formas diferentes en las que puedes deshacer una confirmación.

Opción 1: git reset --hard

Digamos que tiene esto, donde C es su HEAD y (F) es el estado de sus archivos.

   (F)
A-B-C
    ↑
  master

Tú quieres nuke commit C y no volver a verlo nunca más y perder todos los cambios en los archivos modificados localmente. Tu hiciste esto:

git reset --hard HEAD~1

El resultado es:

 (F)
A-B
  ↑
master

Ahora B es la CABEZA. Porque usaste --hard, sus archivos se restablecen a su estado en la confirmación B.

Opción 2: git reset

Ah, pero supongamos que el commit C no fue un desastre, sino un poco fuera de lugar. Tú quieres deshaga la confirmación pero mantenga sus cambios para editar un poco antes de hacer un compromiso mejor. Comenzando de nuevo desde aquí, con C como tu CABEZA:

   (F)
A-B-C
    ↑
  master

Puedes hacer esto, dejando fuera el --hard:

git reset HEAD~1

En este caso el resultado es:

   (F)
A-B-C
  ↑
master

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 uses --hard) deja sus archivos como estaban. Y ahora git status muestra los cambios que ha registrado en C. ¡No ha perdido nada!

Opción 3: git reset --soft

Para el toque más ligero, incluso puedes deshaga su compromiso pero deje sus archivos y su índice:

git reset --soft HEAD~1

Esto no solo deja sus archivos en paz, incluso deja su índice solo. Cuando tu lo hagas git status, verá que los mismos archivos están en el índice que antes. De hecho, justo después de este comando, puede hacer git commit y estaría rehaciendo el mismo compromiso que acababa de tener.

opción 4: lo hiciste git reset --hard y necesito recuperar ese código

Una cosa más: Supongamos que destruyes un compromiso como en el primer ejemplo, pero luego descubre que lo necesitabas después de todo? Mala suerte, ¿verdad?

No, hay posible una forma de recuperarlo. Tipo git reflog y verá una lista de confirmaciones (parciales) shas (es decir, hashes) en los que te has movido. Encuentra la confirmación que destruiste y haz esto:

git checkout -b someNewBranchName shaYouDestroyed

Ahora ha resucitado ese compromiso. En realidad, las confirmaciones no se destruyen en Git durante unos 90 días, por lo que normalmente puedes volver atrás y rescatar una de la que no querías deshacerte.

Respondido 09 Oct 20, 18:10

¡TENER CUIDADO! ¡Esto podría no hacer lo que esperabas si tu confirmación errónea fue una combinación (de avance rápido)! Si su cabeza está en un compromiso de fusión (por ejemplo: función de rama fusionada en maestro), git reset --hard~1 apuntará a la rama maestra a la última confirmación dentro de la rama de características. En este caso, se debe usar el ID de compromiso específico en lugar del comando relativo. - Chris Kerekes

Considere señalar que el número en HEAD~1 puede sustituirse por cualquier número entero positivo, p. ej. HEAD~3. Puede parecer obvio, pero los principiantes (como yo) son muy cuidadosos al ejecutar comandos de git, por lo que es posible que no quieran arriesgarse a estropear algo probando estas cosas ellos mismos. - Sime Vidas

Falta un punto crucial: si dicho compromiso fue previamente 'empujado' al control remoto, cualquier operación de 'deshacer', por simple que sea, causará un enorme dolor y sufrimiento al resto de usuarios que tengan este compromiso en su copia local. cuando hagan un 'git pull' en el futuro. Entonces, si la confirmación ya fue 'presionada', haga esto en su lugar: git revert origen de git push: - FractalEspacio

@FractalSpace, no causará "un dolor y sufrimiento enorme". He hecho algunos empujones de fuerza al usar Git con un equipo. Todo lo que se necesita es comunicación. - ryan lundy

@Kyralessa En mi lugar de trabajo, estropear el flujo de trabajo de todo el equipo y luego decirles cómo arreglar las cosas no se llama "comunicación". La reescritura del historial de git es una operación destructiva que da como resultado la destrucción de partes del repositorio. Insistir en su uso, mientras se dispone de alternativas claras y seguras, es simplemente irresponsable. - FractalEspacio

Hay dos formas de "deshacer" su última confirmación, dependiendo de si ya ha hecho pública su confirmación (enviada a su repositorio remoto):

Cómo deshacer una confirmación local

Digamos que me comprometí localmente, pero ahora quiero eliminar ese compromiso.

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

Para restaurar todo a la forma en que estaba antes de la última confirmación, necesitamos reset al compromiso antes HEAD:

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

Actualmente git log mostrará que nuestra última confirmación ha sido eliminada.

Cómo deshacer una confirmación pública

Si ya ha hecho públicas sus confirmaciones, querrá crear una nueva confirmación que "revertirá" los cambios que realizó en su confirmación anterior (HEAD actual).

git revert HEAD

Sus cambios ahora se revertirán y estarán listos para que los confirme:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Para obtener más información, consulte Conceptos básicos de Git: deshacer cosas.

Respondido el 20 de junio de 20 a las 10:06

Encontré esta respuesta la más clara. git revert HEAD^ no es el anterior, es el anterior del anterior. Yo hice : git revert HEAD y luego presione de nuevo y funcionó :) - nacho4d

Si Git te pregunta "¿Más?" cuando pruebe estos comandos, use la sintaxis alternativa en esta respuesta: stackoverflow.com/a/14204318/823470 - alquitrán

Agregue / elimine archivos para obtener las cosas de la manera que desee:

git rm classdir
git add sourcedir

Luego modifique el compromiso:

git commit --amend

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 realizar una corrección normalmente.

Respondido 12 Oct 16, 07:10

FYI: Esto elimina todos mis archivos y perdí los cambios. - egorlitvinenko

UPD: Sin embargo, lo restauré usando reflog. Pero el recibo no funcionó para la confirmación inicial. - egorlitvinenko

Utilice las git rm --cached para mantener los archivos en el sistema de archivos y solo eliminarlos del índice git. - xuiqzy

git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

or

git reset --hard HEAD~1

Advertencia: El comando anterior eliminará permanentemente las modificaciones al .java archivos (y cualquier otro archivo) que quisiera confirmar.

Las hard reset a HEAD-1 establecerá su copia de trabajo en el estado de la confirmación antes de su confirmación incorrecta.

Respondido el 13 de diciembre de 17 a las 22:12

git commit -a -m "" or git commit -am "" ¡naturalmente! :] - trejder

Otro uso de "atajo" del alijo; si quieres quitar el escenario de todo (deshacer git add), solo git stash, entonces git stash pop - seanriordan08

Para cambiar la última confirmación

Reemplace los archivos en el índice:

git rm --cached *.class
git add *.java

Entonces, si es una sucursal privada, enmendar el compromiso:

git commit --amend

O, si es una rama compartida, realice una nueva confirmación:

git commit -m 'Replace .class files with .java files'


(Para cambiar una confirmación anterior, usa el asombroso rebase interactivo.)


ProTip ™: Agregar *.class a una ignorar para evitar que esto vuelva a suceder.


Para revertir un compromiso

Enmendar una confirmación es la solución ideal si necesita cambiar la última confirmación, pero una solución más general es reset.

Puede restablecer Git a cualquier compromiso con:

git reset @~N

Dónde N es el número de confirmaciones antes HEAD y @~ se restablece a la confirmación anterior.

Entonces, en lugar de enmendar la confirmación, podría usar:

git reset @~
git add *.java
git commit -m "Add .java files"

Comprar git help reset, específicamente las secciones sobre --soft --mixed y --hard, para una mejor comprensión de lo que hace.

Reflog

Si te equivocas, siempre puedes usar el reflog para encontrar confirmaciones descartadas:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


respondido 21 nov., 19:13

Para aquellos que lean en el futuro, tenga en cuenta que git revert es un comando separado, que básicamente 'restablece' un solo comando. - BKSpurgeon

Utilice las git revert <commit-id>.

Para obtener el ID de confirmación, solo use git log.

respondido 21 nov., 19:13

¿Qué significa eso, elegir la cereza del compromiso? En mi caso, estaba en la rama incorrecta cuando edité un archivo. Lo cometí y luego me di cuenta de que estaba en la rama equivocada. El uso de "git reset --soft HEAD ~ 1" me devolvió a justo antes de la confirmación, pero ahora, si verifico la rama correcta, ¿cómo deshago los cambios en el archivo en la rama incorrecta pero en su lugar los hago (en el mismo nombre archivo) en la rama correcta? - astrónomo

Acabo de utilizar git revert commit-id trabajado como un encanto. Por supuesto, entonces deberá impulsar sus cambios. - Casey Robinson

Creo que eso seria git cherry-pick <<erroneous-commit-sha>> @astronomerdave. De, Sr. Casi-2-Años-Tarde-a-la-Fiesta. - Tom Howard

@Kris: En lugar de seleccionar con precisión, usa rebase. Porque es una selección avanzada de cerezas - eugenio konkov

Usaría revertir solo si ya presioné mi compromiso. De lo contrario, restablecer es una mejor opción. No olvide que revertir crea una nueva confirmación y, por lo general, este no es el objetivo. - Hola Soy Edu Feliz Navidad

Si planeas deshacer una confirmación local por completo, cualquier cambio que hayas hecho en la confirmación, y si no te preocupas por eso, simplemente haz el siguiente comando.

git reset --hard HEAD^1

(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 compromiso, pero desea sus cambios en el área de preparación (antes del compromiso como después git add) luego haga el siguiente comando.

git reset --soft HEAD^1

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, haga el siguiente comando

git reset HEAD

Ahora los archivos comprometidos pasarán del área preparada al área no preparada. Ahora los archivos están listos para editar, por lo que sea lo que sea que cambie, desea editarlo, agregarlo y realizar una nueva confirmación.

Más (enlace roto) (Versión archivada)

respondido 21 nov., 20:14

@SMR, en su ejemplo, todos apuntan solo al HEAD actual. CABEZA ^ = CABEZA ^ 1. Además de HEAD ^ 1 = HEAD ~ 1. Cuando usa HEAD ~ 2, hay una diferencia entre los símbolos ~ y ^. Si usa ~ 2 significa "el primer padre del primer padre" o "el abuelo". - madhan ayyasamy

git reset --hard HEAD ^ 1 me da este error "fatal: argumento ambiguo 'HEAD1': revisión desconocida o ruta que no está en el árbol de trabajo". - robar mosher

¿Qué hay de eliminar algunos archivos de la confirmación y conservar otros? - maf

Si tiene Extras de Git instalado, puede ejecutar git undo para deshacer la última confirmación. git undo 3 deshará las últimas tres confirmaciones.

respondido 21 nov., 19:13

Quería deshacer las últimas cinco confirmaciones en nuestro repositorio compartido. Busqué la identificación de revisión a la que quería revertir. Luego escribí lo siguiente.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

respondido 21 nov., 19:13

Reescribir el historial en un repositorio compartido es generalmente una muy mala idea. Supongo que sabes lo que estás haciendo, solo espero que los futuros lectores también lo sepan. - brad koch

Sí, la reversión es peligrosa. Asegúrese de que su copia de trabajo esté en el estado deseado antes de presionar. Al presionar, las confirmaciones no deseadas se eliminan de forma permanente. - ojo de neón

"Al igual que en el mundo real, si quieres reescribir la historia, necesitas una conspiración: todo el mundo tiene que estar 'involucrado' en la conspiración (al menos todos los que conocen la historia, es decir, todos los que alguna vez han salido de la rama) . " Fuente: stackoverflow.com/a/2046748/334451 - Mikko Rantalainen

Prefiero usar git rebase -i para este trabajo, porque aparece una buena lista donde puedo elegir las confirmaciones de las que deshacerme. Puede que no sea tan directo como algunas otras respuestas aquí, pero simplemente se siente bien.

Elija cuántas confirmaciones desea enumerar, luego invoque así (para alistar las últimas tres)

git rebase -i HEAD~3

Lista de muestra

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Luego, Git eliminará las confirmaciones de cualquier línea que elimine.

Respondido el 06 de diciembre de 18 a las 21:12

Encuentro esto realmente útil para deshacer fusiones / selecciones de cereza de, por ejemplo, una rama de característica inestable - FredL

Cómo arreglar el compromiso local anterior

Utilice git-gui (o similar) para realizar una 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 or git 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 hubiera sucedido. Para hacer todo eso en un solo comando, use git reset HEAD~1.

Palabra de advertencia: Uso descuidado de git reset es una buena forma de poner su copia de trabajo en un estado confuso. Recomiendo que los novatos de Git eviten esto si pueden.

Cómo deshacer una confirmación pública

Lleve a cabo una selección de cereza inversa (git-revertir) para deshacer los cambios.

Si aún no ha realizado otros cambios en su rama, simplemente puede hacer ...

git revert --no-edit HEAD

Luego, envíe su rama actualizada al repositorio compartido.

El historial de confirmaciones mostrará ambas confirmaciones, por separado.


Avanzado: corrección de la privada rama en repositorio público

Esto puede ser peligroso; asegúrese de tener una copia local de la sucursal para repush.

También tenga en cuenta: no desea hacer esto si alguien más puede estar trabajando en la rama.

git push --delete (branch_name) ## remove public version of branch

Limpia tu sucursal localmente y luego repush ...

git push origin (branch_name)

En el caso normal, probablemente no tenga que preocuparse de que el historial de confirmaciones de su rama privada sea impecable. Simplemente envíe una confirmación de seguimiento (consulte 'Cómo deshacer una confirmación pública' más arriba) y luego haga una mezcla de calabaza para ocultar la historia.

Respondido el 07 de diciembre de 18 a las 05:12

gitk --all $(git reflog | cut -c1-7)& puede ser útil para encontrar la revisión anterior si desea deshacer una confirmación '--amend'. - brent bradburn

Cabe señalar que si está intentando eliminar información secreta antes de enviarla a un repositorio compartido, hacer una reversión no le ayudará, porque la información seguirá estando en el historial en la confirmación anterior. Si desea asegurarse de que el cambio nunca sea visible para los demás, debe usar git reset - Jherico

Creo que 'privado' / 'público' sería más correctamente 'local' / 'remoto'. - brent bradburn

La corrección de una rama privada en un repositorio remoto también se puede hacer simplemente git push origin (branch_name) --force - brent bradburn

Si desea deshacerlo permanentemente y ha clonado algún repositorio

El ID de confirmación puede ser visto por

git log 

Entonces puedes hacer ...

git reset --hard <commit_id>

git push origin <branch_name> -f

Respondido el 24 de junio de 15 a las 10:06

¿Qué pasa si no usa " "y simplemente usar" git reset --hard "? Normalmente solo quiero deshacerme de mis últimas actualizaciones que aún no he confirmado y volver a la última confirmación que hice, y siempre uso" git reset --hard " . - Jaime Montoya

@JaimeMontoya Para deshacer los últimos cambios, puede usar git reset --hard , pero si tienes que eliminar las últimas confirmaciones "n", especificas un SHA - pobre

Si ha cometido basura pero no ha empujado,

git reset --soft HEAD~1

CABEZA ~ 1 es una abreviatura de la confirmación antes del encabezado. Alternativamente, puede consultar el SHA-1 del hash si desea restablecer. --suave La opción eliminará la confirmación, pero dejará todos los archivos modificados "Cambios a confirmar", como lo pondría git status.

Si desea deshacerse de cualquier cambio en los archivos rastreados en el árbol de trabajo desde la confirmación antes del uso principal "--difícil"en cambio.

OR

Si ya empujaste y alguien tiró, que suele ser mi caso, no puedes usar git restablecer. Sin embargo, puede hacer un git revertir,

git revert HEAD

Esto creará una nueva confirmación que revierte todo lo introducido por la confirmación accidental.

Respondido el 25 de Septiembre de 14 a las 08:09

Estoy en el segundo caso, pero cuando hago "git revert HEAD" dice "error: Commit [ID] es una combinación pero no se dio la opción -m. Fatal: revert failed". ¿Alguna sugerencia? - metaforja

Probablemente valga la pena mencionar que en lugar de HEAD~1 podría utilizar el hash real como se muestra por git log --stat o por git reflog - útil cuando necesita 'deshacer' más de una confirmación. - ccpizza

On SourceTree (GUI para GitHub), puede hacer clic con el botón derecho en la confirmación y realizar una 'Confirmación inversa'. Esto debería deshacer los cambios.

En la terminal:

Alternativamente, puede utilizar:

git revert

o:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

Respondido el 24 de junio de 15 a las 10:06

Un solo comando:

git reset --soft 'HEAD^' 

¡Funciona muy bien para deshacer la última confirmación local!

Respondido 21 Jul 14, 21:07

Necesitaba escribir git reset --soft "HEAD ^" con comillas dobles, porque lo escribo desde el símbolo del sistema de Windows. - Ena

Simplemente reinícielo haciendo el siguiente comando usando git:

git reset --soft HEAD~1

Explique: qué git reset hace, es básicamente reset a cualquier compromiso al que le gustaría volver, entonces si lo combina con --soft key, volverá, pero mantenga los cambios en su (s) archivo (s), para que vuelva a la etapa en la que se acaba de agregar el archivo, HEAD es la cabecera de la rama y si combinas con ~1 (en este caso también usas HEAD^), retrocederá solo una confirmación que sea lo que desee ...

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:

¿Cómo deshacer las últimas confirmaciones en Git?

Respondido 27 Oct 17, 13:10

¿Cómo deshacer la última confirmación de Git?

Para restaurar todo a la forma en que estaba antes de la última confirmación, debemos restablecer la confirmación antes de HEAD.

  1. Si no desea conservar los cambios que realizó:

    git reset --hard HEAD^
    
  2. Si desea conservar sus cambios:

    git reset --soft HEAD^
    

Ahora revisa tu registro de git. Mostrará que nuestra última confirmación ha sido eliminada.

respondido 25 mar '17, 08:03

"Restablecer el árbol de trabajo a la última confirmación"

git reset --hard HEAD^ 

"Limpiar archivos desconocidos del árbol de trabajo"

git clean    

ver - Referencia rápida de Git

NOTA: Este comando eliminará tu confirmación anterior, ¡así que utilízalo con precaución! git reset --hard Es más seguro.

Respondido el 13 de diciembre de 19 a las 16:12

Utilice reflog para encontrar un estado correcto

git reflog

volver a iniciar sesión antes REFLOG ANTES DE REINICIAR

Seleccione el reflog correcto (f3cb6e2 en mi caso) y escriba

git reset --hard f3cb6e2

Después de eso, el repositorio HEAD se restablecerá a ese HEADid efecto de reinicio REGISTRO DESPUÉS DE REINICIAR

Finalmente, el reflog se parece a la imagen de abajo

volver a iniciar sesión después REFLOG FINAL

Respondido el 06 de enero de 14 a las 22:01

Primer intento:

git reflog

Le mostrará todas las posibles acciones que ha realizado en su repositorio, por ejemplo, confirmar, fusionar, extraer, etc.

Entonces hazlo:

git reset --hard ActionIdFromRefLog

Respondido el 24 de junio de 15 a las 10:06

Deshacer la última confirmación:

git reset --soft HEAD^ or git reset --soft HEAD~

Esto deshará la última confirmación.

Aquí --soft significa reiniciar en la puesta en escena.

HEAD~ or HEAD^ significa moverse para comprometerse antes de HEAD.


Reemplazar la última confirmación por una nueva confirmación:

git commit --amend -m "message"

Reemplazará la última confirmación con la nueva confirmación.

Respondido el 13 de diciembre de 17 a las 22:12

De otra manera:

Verifique la rama que desea revertir, luego restablezca su copia de trabajo local de nuevo a la confirmación que desea que sea la más reciente en el servidor remoto (todo lo que viene después se irá adiós). Para hacer esto, en SourceTree hice clic derecho en y seleccioné "Restablecer BRANCHNAME a esta confirmación".

Luego navegue hasta el directorio local de su repositorio y ejecute este comando:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Esto borrará todas las confirmaciones posteriores a la actual en su repositorio local, pero solo para esa rama.

Respondido el 24 de junio de 15 a las 10:06

Tipo git log y busque el último código hash de confirmación y luego ingrese:

git reset <the previous co>

Respondido el 24 de junio de 15 a las 10:06

En mi caso, accidentalmente cometí algunos archivos que no quería. Así que hice lo siguiente y funcionó:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

Verifique los resultados con gitk o git log --stat

Respondido el 24 de junio de 15 a las 10:06

Simple, ejecute esto en su línea de comando:

git reset --soft HEAD~ 

Respondido el 18 de enero de 16 a las 21:01

Hay dos escenarios principales

Aún no has presionado el compromiso

Si el problema fueron archivos adicionales que comprometió (y no los quiere en el repositorio), puede eliminarlos usando git rm y luego comprometerse con --amend

git rm <pathToFile>

También puede eliminar directorios completos con -r, o incluso combinar con otros Asestar un golpe comandos

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

Después de eliminar los archivos, puede confirmar, con --enmendar opción

git commit --amend -C HEAD # the -C option is to use the same commit message

Esto reescribirá su confirmación local reciente eliminando los archivos adicionales, por lo que estos archivos nunca se enviarán en forma push y también serán eliminados de su repositorio .git local por GC.

Ya presionaste el compromiso

Puede aplicar la misma solución del otro escenario y luego hacer git push con el -f opción, pero es no se recomienda ya que sobrescribe el historial remoto con un cambio divergente (puede estropear su repositorio).

En cambio, tienes que hacer el compromiso sin --amend (recuerde esto sobre -amend`: esa opción reescribe el historial en la última confirmación).

Respondido el 11 de enero de 16 a las 23:01

Para un compromiso local

git reset --soft HEAD~1

o si no recuerda exactamente en qué compromiso está, puede usar

git rm --cached <file>

Para un compromiso empujado

La forma correcta de eliminar archivos del historial del repositorio es mediante git filter-branch. Es decir,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Pero te recomiendo que uses este comando con cuidado. Lea mas en git-filter-branch (1) Página del manual.

Respondido 21 Jul 14, 21:07

Para restablecer la revisión anterior, eliminando permanentemente todos los cambios no confirmados:

git reset --hard HEAD~1

Respondido el 16 de Septiembre de 16 a las 08:09

Tal vez podrías en una nota / advertencia de que su comando desechará el compromiso y los cambios en el directorio de trabajo sin preguntar más. - cr7pt0gr4ph7

Utilice las --soft para mantener sus cambios como uncommitted changes, --hard para destruir el compromiso por completo y revertirlo en uno. Recuerde realizar estas operaciones solo en los cambios que aún no se hayan introducido. - Yunus Nedim Mehel

@Zaz: Tienes razón; tal vez debería haberlo aclarado. Solo se pueden recuperar los archivos / cambios que se han agregado al índice (/ en etapas) o que se han confirmado. Cambios no comprometidos y sin etapas están, como dijiste, completamente desechado por git reset --hard. - cr7pt0gr4ph7

Como nota al margen: cada vez que se prepara un archivo, 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 estaba preparada actualmente cuando git reset --hard se ejecutó (consulte las publicaciones vinculadas arriba para obtener más información). - cr7pt0gr4ph7

Hay muchas formas de hacerlo:

Comando de Git para deshacer la última confirmación / confirmaciones anteriores:

Aviso: No use --hard si no sabe lo que está haciendo. --duro es demasiado mas peligrosoy podría borre sus archivos.

El comando básico para revertir la confirmación en Git es:

$ git reset --hard <COMMIT -ID>

or

$ git reset --hard HEAD~<n>

COMMIT-ID: ID para el compromiso

n: es el número de últimas confirmaciones que desea revertir

Puede obtener la identificación de compromiso como se muestra a continuación:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

sin que importe d81d3f1 y be20eb8 son id de compromiso.

Ahora veamos algunos casos:

Suponga que desea revertir la última confirmación 'd81d3f1'. Aquí hay dos opciones:

$ git reset --hard d81d3f1

or

$ git reset --hard HEAD~1

Suponga que desea revertir la confirmación 'be20eb8':

$ git reset --hard be20eb8

Para obtener información más detallada, puede consultar y probar algunos otros comandos también para restablecer el cabezal a un estado específico:

$ git reset --help

Respondido 19 ago 18, 15:08

git reset --hard HEAD~1 is demasiado peligroso! Esto no solo 'cancelará la última confirmación', sino que revertirá el repositorio completamente a la confirmación anterior. ¡Entonces PERDERÁS todos los cambios cometidos en la última confirmación! - Arnis Juraga

Tienes razón, para deshacer esto puedes usar git push -f <remote> HEAD@{1}:<branch> - Benny

Desafortunadamente, utilizo --hard, ¡y mis archivos se eliminan! No verifiqué el comentario primero porque está contraído. ¡No use --hard si no sabe lo que está haciendo! - anónimo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.