¿Cómo deshago las confirmaciones recientes en git?

Accidentalmente envié los archivos equivocados a Git , pero aún no he enviado un compromiso al servidor.

¿Cómo puedo cancelar estas confirmaciones desde el repositorio local?

18990
29 мая '09 в 21:09 2009-05-29 21:09 Hamza Yerlikaya preguntó el 29 de mayo de 2009 a las 21:09 2009-05-29 21:09
@ 92 respuestas

Deshacer y rehacer

20501
29 мая '09 в 21:13 2009-05-29 21:13 respuesta dada por Esko Luontola 29 de mayo de 2009 a las 21:13 2009-05-29 21:13

Cancelar un compromiso es un poco atemorizante si no sabes cómo funciona. Pero en realidad es sorprendentemente fácil, si lo entiendes.

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

  (F) ABC ↑ master 

Quieres reiniciar el commit C y no volver a verlo nunca . Tu haces esto

 git reset --hard HEAD~1 

Resultado:

  (F) AB ↑ master 

Ahora B - HEAD. Desde que --hard - --hard , tus archivos regresan a su estado cuando confirmas B.

Ah, pero supongamos que cometer C no es un desastre, sino bastante. Desea cancelar un compromiso, pero guarde los cambios para una pequeña edición antes de realizar el mejor compromiso. Comenzando aquí de nuevo, con C como tu cabeza:

  (F) ABC ↑ master 

Puedes hacerlo dejando --hard

border=0
 git reset HEAD~1 

En este caso, el resultado es:

  (F) ABC ↑ 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 ) dejas tus archivos como estaban. Ahora el git status muestra los cambios que registró en C. ¡No ha perdido nada!

Para un toque ligero, incluso puede cancelar la confirmación, pero deje sus archivos e índice :

 git reset --soft HEAD~1 

Esto no solo deja sus archivos solos, sino que incluso deja su índice solo. Cuando hagas el git status , verás que el índice contiene los mismos archivos que antes. De hecho, justo después de este comando, puedes ejecutar git commit y rehacerás el mismo commit que acabas de tener.

Una cosa más: supongamos que destruyes un commit, como en el primer ejemplo, ¿ pero luego descubriste que lo necesitas al final ? No hay suerte, ¿verdad?

No, todavía hay una manera de recuperarlo. Escriba git reflog , y verá una lista de (parcialmente) cometer SHAS (es decir, hash) que ha movido para encontrar el compromiso que destruyó y hacerlo.

 git checkout -b someNewBranchName shaYouDestroyed 

Ahora has resucitado este compromiso. Los comités no se destruyen realmente en Git durante aproximadamente 90 días, por lo que generalmente puede regresar y guardar uno que no deseaba eliminar.

10099
29 июля '11 в 1:22 2011-07-29 01:22 la respuesta la da Ryan Lundy el 29 de julio de 2011 al 1:22 2011-07-29 01:22

Me tomó algo de tiempo entenderlo, así que quizás esto ayude a alguien ...

Hay dos formas de "deshacer" su último compromiso, dependiendo de si realizó un informe público (haciendo clic en el repositorio remoto):

Cómo cancelar un compromiso local

Que se diga que lo hice localmente, pero ahora quiero eliminar esta fijación.

 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 antes de que fuera antes de la última confirmación, debemos realizar un reset antes de confirmar antes de 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 

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

Cómo cancelar una solución pública

Si ya ha hecho públicos sus compromisos, deberá crear un nuevo compromiso que "devuelva" los cambios realizados en el compromiso anterior (el HEAD actual).

 git revert HEAD 

Ahora tus cambios serán deshechos y listos para ser comprometidos:

 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 más información, echa un vistazo a Git Basics - Cancel Things.

1889
16 июня '11 в 20:27 2011-06-16 20:27 La respuesta la da Andrew el 16 de junio de 2011 a las 20:27 2011-06-16 20:27

Agrega / elimina archivos para obtener lo que deseas:

 git rm classdir git add sourcedir 

Luego cambia el commit:

 git commit --amend 

La corrección errónea anterior se editará para reflejar el nuevo estado del índice; en otras palabras, parecerá que nunca cometió un error en primer lugar.

Tenga en cuenta que solo debe hacer esto si aún no ha hecho clic. Si hiciste clic, solo tienes que comprometerte a arreglarlo normalmente.

1664
29 мая '09 в 21:16 2009-05-29 21:16 la respuesta se da bdonlan 29 de mayo de 2009 a las 21:16 2009-05-29 21:16
926
29 мая '09 в 21:13 2009-05-29 21:13 Lennart Koopmann respondió el 29 de mayo de 2009 a las 21:13 2009-05-29 21:13

Para cambiar el ultimo commit

Reemplazar archivos en el índice:

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

Luego, si es una rama privada, cambia el commit:

 git commit --amend 

O, si se trata de una rama compartida, realice una nueva confirmación:

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


( Para cambiar la confirmación anterior , utilice una rebase interactiva increíble)


ProTip ™: agregue *.class a gitignore para detener esta repetición.


Para devolver un arreglo

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

Puedes restablecer git a cualquier accesorio usando:

 git reset @~N 

Donde N es el número de confirmaciones antes de HEAD , y @~ vuelve a la confirmación anterior.

Así que en lugar de hacer cambios a un compromiso puedes usar:

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

Compruebe git help reset , en particular, las --soft --mixed y --hard para comprender mejor lo que hace.

Reflog

Si se equivoca, siempre puede usar la función de inicio de sesión para encontrar confirmaciones remotas:

 $ 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 


707
31 июля '10 в 12:39 2010-07-31 12:39 la respuesta se da a Zaz el 31 de julio de 2010 a las 12:39 2010-07-31 12:39

Use git revert <commit-id>

Para obtener una ID de corrección, solo usa git log

589
25 мая '12 в 19:04 2012-05-25 19:04 Jaco Pretorius da la respuesta el 25 de mayo de '12 a las 19:04 2012-05-25 19:04

Si planea cancelar el compromiso local por completo, no importa lo que cambie, hizo un compromiso y, si no se preocupa, simplemente ejecute el siguiente comando.

 git reset --hard HEAD^1 

(Este comando ignorará todos sus compromisos y sus cambios se perderán completamente de su árbol de trabajo local). Si desea cancelar una confirmación, pero desea realizar cambios en el área de preparación (antes de realizar la confirmación, al igual que después de git add ), ejecute el siguiente comando.

 git reset --soft HEAD^1 

Ahora sus archivos fijos están en el área de preparación. Supongamos que si desea exceder los archivos, ya que necesita editar el contenido incorrecto, ejecute el siguiente comando

 git reset HEAD 

Ahora los archivos transferidos provienen del área en fase al área sin entregar. Ahora los archivos están listos para editar, por lo que, independientemente de lo que cambie, desea editarlo, agregarlo y crear un nuevo / nuevo compromiso.

Más

472
31 янв. La respuesta se da Madhan Ayyasamy 31 de enero. 2013-01-31 10:06 '13 a las 10:06 2013-01-31 10:06

Si tiene instalado Git Extras , puede ejecutar git undo para deshacer el último compromiso. git undo 3 cancela las 3 últimas confirmaciones.

451
13 дек. la respuesta se da nickf 13 dec. 2011-12-13 13:18 '11 a las 13:18 2011-12-13 13:18

Quería cancelar las últimas 5 confirmaciones en nuestro repositorio compartido. Miré la identificación de revisión que quería revertir. Entonces 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> 
419
06 апр. la respuesta se da neoneye 06 de abril. 2012-04-06 16:58 '12 a las 4:58 pm 2012-04-06 16:58

Prefiero usar git rebase -i para esta tarea, porque hay una buena lista donde puedo seleccionar los compromisos para deshacerme de ellos. Puede que no sea tan sencillo como algunas de las otras respuestas aquí, pero parece correcto.

Seleccione el número de confirmaciones que desea enumerar, luego llámelo (para recoger los últimos 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 

Git entonces eliminará la confirmación para que se elimine cualquier línea.

397
25 окт. Respuesta dada por Steven Penny el 25 de octubre. 2012-10-25 06:41 '12 a las 6:41 am 2012-10-25 06:41

Cómo arreglar el compromiso local anterior

Use git-gui (o equivalente) para realizar git commit --amend . Desde la GUI, puede agregar o eliminar archivos individuales de la confirmación. También puede cambiar el mensaje de confirmación.

Cómo cancelar el compromiso local anterior

Simplemente devuelva su sucursal a su ubicación anterior (por ejemplo, usando gitk o git rebase ). Luego vuelva a aplicar los cambios de la copia guardada. Después de la recolección de basura en su almacenamiento local será como el hecho de que nunca se produjo un compromiso no deseado. Para hacer todo esto en un comando, use git reset HEAD~1 .

Una advertencia : el uso descuidado de git reset es una buena manera de confundir su copia de trabajo. Recomiendo a los novatos de Git que eviten esto si pueden.

Cómo cancelar un compromiso público.

Invierta la selección de cereza ( git-revert ) para descartar los cambios.

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

 git revert --no-edit HEAD 

Luego envíe la rama actualizada al repositorio común.

El historial de confirmaciones mostrará ambas confirmaciones por separado.


Opcional: arreglar la rama privada en el repositorio público

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

También tenga en cuenta: no quiere hacer esto si alguien más está trabajando en la sucursal.

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

Limpia tu rama localmente, luego empuja ...

 git push origin (branch_name) 

En el caso normal, probablemente no tenga que preocuparse de que su historial de confirmación en una sucursal privada no se toque. Simplemente haga clic en un compromiso posterior (consulte “Cómo cancelar un compromiso público” más arriba) y luego haga una fusión de squash para ocultar la historia.

382
23 апр. La respuesta se da nobar 23 abr. 2013-04-23 20:27 '13 a las 20:27 2013-04-23 20:27

Si cometió un error, pero no hizo clic,

 git reset --soft HEAD~1 

HEAD ~ 1 es la abreviatura de fijación en frente de la cabeza. Alternativamente, puede consultar el hash SHA-1 si desea restablecerlo. --soft eliminará la confirmación, pero dejará todos los archivos modificados "Se harán cambios", como diría el estado de git.

Si desea deshacerse de cualquier cambio en los archivos monitoreados en el árbol de trabajo, desde la confirmación antes de que la voz use " --hard ".

O

Si ya has hecho clic y alguien ha tirado, lo que normalmente es mi negocio, no puedes usar git reset. Sin embargo, usted puede hacer git revertir,

 git revert HEAD 

Esto creará una nueva solución, que cancela todo lo que se ingresa con una solución aleatoria.

307
03 сент. La respuesta se da santos_mgr 03 sep . 2014-09-03 10:15 '14 a las 10:15 a.m. 2014-09-03 10:15

Si desea cancelarlo permanentemente, y ha clonado algún repositorio

Se puede ver la ID del arreglo.

 git log 

Entonces puedes hacer ...

 git reset --hard <commit_id> git push origin <branch_name> -f 
303
17 мая '13 в 16:02 2013-05-17 16:02 la respuesta es dada por poorva el 17 de mayo de 2013 a las 4:02 2013-05-17 16:02

En SourceTree (GUI para GitHub), puede hacer clic derecho en la confirmación y ejecutar Reverse Fix. Esto debería deshacer tus cambios.

En la terminal:

También puedes usar:

 git revert 

O

256
28 июня '13 в 13:18 2013-06-28 13:18 Varun Parakh da la respuesta el 28 de junio de 2013 a las 13:18 2013-06-28 13:18

Solo equipo

241
05 марта '14 в 16:55 2014-03-05 16:55 Manish Shrivastava da la respuesta el 5 de marzo de 2014 a las 16:55 2014-03-05 16:55

Solo reinícialo ejecutando el siguiente comando usando git :

 git reset --soft HEAD~1 

Explique que lo que hace git reset es básicamente reset a cualquier --soft que desee volver, luego, si lo --soft con --soft , volverá, pero guarde los cambios en sus archivos, por lo que volverá a la escena en la que se ha agregado un archivo, HEAD es la cabecera de la rama, y ​​si lo combina con ~1 (en este caso, también usa HEAD^ ), volverá al único comando que desee ...

Creo los pasos en la imagen a continuación con más detalle para usted, incluidos todos los pasos que pueden ocurrir en situaciones reales y la ejecución del código:

2019

21 июня '17 в 12:33 2017-06-21 12:33 Alireza da la respuesta el 21 de junio de 2017 a las 12:33 2017-06-06 12:33

¿Cómo cancelar el último git?

Para restaurar todo lo que era antes de la última confirmación, debemos restablecer la solución a HEAD.

  1. Si no desea guardar los cambios realizados:

     git reset --hard HEAD^ 
  2. Si quieres guardar tus cambios:

     git reset --soft HEAD^ 

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

214
23 апр. La respuesta es dada a Ranjithkumar Ravi el 23 de abril. 2014-04-23 14:21 14 a las 14:21 2014-04-23 14:21

Utilice reflog para encontrar el estado correcto.

 git reflog 

2019

172
07 янв. respuesta dada por Shubham Chaudhary 07 de enero 2014-01-07 01:34 '14 a la 1:34 2014-01-07 01:34

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

 git reset --hard HEAD^ 

"Borrar archivos desconocidos del árbol de trabajo"

 git clean 

ver - Referencia rápida de Git

NOTA. Este comando eliminará la confirmación anterior, así que utilícelo con precaución. git reset --hard más seguro -

167
03 окт. Respuesta dada Ravi_Parmar 03 de octubre. 2013-10-03 15:43 '13 a las 15:43 2013-10-03 15:43

Primera ejecución:

 git reflog 

Le mostrará todas las acciones posibles que realizó en su repositorio, por ejemplo, cometer, fusionar, extraer, etc.

Entonces haz:

 git reset --hard ActionIdFromRefLog 
150
11 окт. La respuesta la da U. Ali el 11 de octubre. 2013-10-11 17:41 '13 a las 17:41 2013-10-11 17:41

Cancelar la última confirmación:

git reset --soft HEAD^ o git reset --soft HEAD~

Esto deshará la última confirmación.

Aquí --soft significa restablecer la configuración.

HEAD~ o HEAD^ significa ir a un commit antes que HEAD.


Reemplace la última confirmación por una nueva:

 git commit --amend -m "message" 

Reemplazará la última confirmación con un nuevo fijador.

141
06 марта '16 в 14:53 2016-03-06 14:53 la respuesta se da akshay_rahar 06 de marzo de 2016 a las 14:53 2016-03-06 14:53

Otra forma:

Realice una solicitud para la sucursal que desea devolver, luego devuelva la copia de trabajo local a la confirmación que desea que sea la última en el servidor remoto (todo después de que se vaya, adiós). Para hacer esto, hice clic derecho en SourceTree y elegí "Restablecer BRANCHNAME para este compromiso".

Luego vaya al directorio del repositorio local y ejecute el siguiente comando:

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

Esto eliminará todas las confirmaciones posteriores a la actual en el repositorio local, pero solo para una rama.

136
13 мая '13 в 20:12 2013-05-13 20:12 La respuesta se da CommaToast 13 de mayo, '13 a las 8:12 pm 2013-05-13 20:12

Ingrese a git log y encuentre el último código hash e ingrese:

 git reset <the previous co> 
127
15 мая '13 в 16:12 2013-05-15 16:12 la respuesta la da el usuario 853293, 15 de mayo de 2013, a las 16:12 2013-05-15 16:12

En mi caso, accidentalmente hice 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 

Compruebe los resultados con gitk o git log --stat

124
18 июля '13 в 9:41 2013-07-18 09:41 La respuesta es dada por egridasov el 18 de julio de '13 a las 9:41 2013-07-18 09:41

Use SourceTree (una herramienta gráfica para Git) para ver sus confirmaciones y su árbol. Puede restablecerlo manualmente haciendo clic derecho.

113
29 авг. La respuesta está dada para iOS Coder 29 ago. 2013-08-29 19:18 '13 a las 19:18 2013-08-29 19:18

Para volver a la revisión anterior, elimine permanentemente todos los cambios no confirmados:

 git reset --hard HEAD~1 
111
28 авг. la respuesta es dada por thestar 28 ago. 2014-08-28 19:03 '14 a las 19:03 2014-08-28 19:03

Hay dos escenarios principales.

No has presionado el commit

Si el problema está relacionado con archivos adicionales que ha confirmado (y no desea usarlos en el repositorio), puede eliminarlos con git rm y luego --amend con --amend

 git rm <pathToFile> 

También puedes eliminar directorios completos con -r o incluso combinarlos con otros comandos de bash .

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

Después de eliminar los archivos, puede comprometerse usando la opción --amend

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

Esto le permitirá reescribir un compromiso local reciente, eliminando archivos innecesarios, por lo que estos archivos nunca se enviarán para empujar, y también se eliminarán de su repositorio local .git a través de GC.

Ya has hecho click en un commit

Puede aplicar la misma solución a un script diferente, y luego ejecutar git push con la opción -f en -f , pero esto no es recomendable, ya que sobrescribe el historial eliminado con un cambio divergente (esto puede dañar su repositorio).

En su lugar, debe confirmar sin la --amend (recuerde esta modificación: esta opción sobrescribe el historial de la última confirmación).

111
12 сент. la respuesta se da dseminara 12 sep . 2014-09-12 17:51 '14 a las 17:51 2014-09-12 17:51

Para la fijación local

 git reset --soft HEAD~1 

o si no recuerda exactamente qué fijación es posible, puede usar

 git rm --cached <file> 

Para presionar hacia abajo

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

la sección Manual de git-filter-branch (1) . 

111
04 марта '14 в 7:35 2014-03-04 07:35 geoom dio la respuesta el 4 de marzo de 2014 a las 7:35 2014-03-04 07:35

Hay muchas maneras de hacer esto: