it-swarm-es.com

Cómo revertir un repositorio Git a un commit anterior

¿Cómo vuelvo de mi estado actual a una instantánea realizada en una confirmación determinada?

Si hago git log, obtengo el siguiente resultado:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

¿Cómo volver al compromiso desde el 3 de noviembre, es decir, cometer 0d1d7fc?

6795
Crazy Serb

Esto depende mucho de lo que quiere decir con "revertir".

Cambiar temporalmente a un commit diferente

Si desea volver temporalmente a él, tontear, luego volver a donde está, todo lo que tiene que hacer es revisar el compromiso deseado:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

O si quieres hacer confirmaciones mientras estás allí, sigue adelante y crea una nueva sucursal mientras estás en ello:

git checkout -b old-state 0d1d7fc32

Para volver a donde estaba, solo revise la rama en la que estaba nuevamente. (Si ha realizado cambios, como siempre al cambiar de sucursal, tendrá que tratar con ellos según corresponda. Podría reiniciar para desecharlos; podría esconder, retirar y guardar para llevarlos consigo; podría cometer ellos a una rama allí si quieres una rama allí.)

Duro borrar los compromisos no publicados.

Si, por otro lado, quieres realmente deshacerte de todo lo que has hecho desde entonces, hay dos posibilidades. Una, si no ha publicado ninguno de estos compromisos, simplemente reinicie:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Si te equivocas, ya has desechado tus cambios locales, pero al menos puedes volver a donde estabas antes restableciendo nuevamente.

Deshacer confirmaciones publicadas con nuevas confirmaciones

Por otro lado, si ha publicado el trabajo, es probable que no desee restablecer la rama, ya que eso es efectivamente reescribir el historial. En ese caso, efectivamente podría revertir las confirmaciones. Con Git, revertir tiene un significado muy específico: crear una confirmación con el parche inverso para cancelarla. De esta manera no reescribirás ninguna historia.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

La página de manual git-revert en realidad cubre mucho de esto en su descripción. Otro enlace útil es esta sección de git-scm.com que trata sobre git-revert .

Si decide que no quería revertir después de todo, puede revertir la reversión (como se describe aquí) o restablecerla antes de la reversión (consulte la sección anterior).

También puede encontrar útil esta respuesta en este caso:
¿Cómo mover HEAD a una ubicación anterior? (Cabeza separada)

8690
Cascabel

Volviendo copia de trabajo a la más reciente Commit

Para volver a una confirmación anterior, ignorando cualquier cambio:

git reset --hard HEAD

donde HEAD es la última confirmación en tu rama actual

Revertir la copia de trabajo a una confirmación anterior

Para revertir a una confirmación anterior a la confirmación más reciente:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Los créditos se dirigen a una pregunta similar de desbordamiento de pila,¿Volver a un commit por un SHA hash en Git?.

1451
boulder_ruby

Muchas respuestas complicadas y peligrosas aquí, pero en realidad es fácil:

git revert --no-commit 0766c053..HEAD
git commit

Esto revertirá todo, desde el HEAD al hash de confirmación, lo que significa que volverá a crear ese estado de confirmación en el árbol de trabajo como si todas las confirmaciones desde que se regresó. A continuación, puede confirmar el árbol actual, y creará un nuevo compromiso esencialmente equivalente al compromiso al que usted "revertió".

(El indicador --no-commit permite a git revertir todas las confirmaciones a la vez; de lo contrario, se le solicitará un mensaje para cada confirmación en el rango, ensuciando su historial con nuevas confirmaciones innecesarias).

Esta es una forma segura y fácil de revertir a un estado anterior. No se destruye ninguna historia, por lo que se puede utilizar para confirmaciones que ya se han hecho públicas.

1433
Yarin

La mejor opción para mí y probablemente otras es la opción de reinicio de Git:

git reset --hard <commidId> && git clean -f

Esta ha sido la mejor opción para mí! ¡Es simple, rápido y efectivo!


Nota: Como se menciona en los comentarios, no haga esto si está compartiendo su sucursal con otras personas que tienen copias de los antiguos compromisos

También de los comentarios, si quisieras un método menos 'tonto' podrías usar

git clean -i

182
Pogrindis

Antes de responder, agreguemos algunos antecedentes, explicando qué es esta HEAD.

First of all what is HEAD?

HEAD es simplemente una referencia al compromiso actual (más reciente) en la rama actual. Solo puede haber una HEAD en un momento dado (excluyendo git worktree).

El contenido de HEAD se almacena dentro de .git/HEAD, y contiene los 40 bytes SHA-1 de la confirmación actual.


detached HEAD

Si no está en la última confirmación, lo que significa que HEAD apunta a una confirmación anterior en el historial, se llamadetached HEAD.

 Enter image description here

En la línea de comandos se verá así: SHA-1 en lugar del nombre de la rama ya que la HEAD no apunta a la punta de la rama actual:

 Enter image description here


Algunas opciones sobre cómo recuperarse de una CABEZA separada:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Esto hará que la nueva rama apunte a la confirmación deseada. Este comando realizará el checkout a un commit dado.

En este punto, puede crear una rama y comenzar a trabajar desde este punto en:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Siempre puedes usar la reflog también. git reflog mostrará cualquier cambio que actualice la HEAD, y al revisar la entrada deseada del reflog, la HEAD volverá a esta confirmación.

Cada vez que se modifique HEAD habrá una nueva entrada en reflog

git reflog
git checkout [email protected]{...}

Esto te llevará de vuelta a tu compromiso deseado

 Enter image description here


git reset HEAD --hard <commit_id>

"Mueve" tu cabeza hacia atrás hasta el compromiso deseado.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Nota: ( Desde Git 2.7 ) también puede usar el git rebase --no-autostash también.

Este esquema ilustra qué comando hace qué. Como puede ver, reset && checkout modifica HEAD.

 Enter image description here

143
CodeWizard

Si desea "anular la confirmación", borre el último mensaje de confirmación y vuelva a colocar los archivos modificados en la preparación, debe usar el comando:

git reset --soft HEAD~1
  • --soft indica que los archivos no confirmados deben conservarse como archivos de trabajo en oposición a --hard que los descartaría.
  • HEAD~1 es el último commit. Si desea deshacer 3 confirmaciones, puede usar HEAD~3. Si desea revertir a un número de revisión específico, también puede hacerlo usando su SHA hash.

Este es un comando extremadamente útil en situaciones en las que cometió un error y desea deshacer ese último compromiso.

Fuente: http://nakkaya.com/2009/09/24/git-delete-last-commit/

124

He intentado muchas formas de revertir los cambios locales en Git, y parece que esto funciona mejor si solo quieres revertir al estado de confirmación más reciente.

git add . && git checkout master -f

Breve descripción:

  • NO creará ninguna confirmación como lo hace git revert.
  • NO separará su HEAD como git checkout <commithashcode> hace.
  • ANULARÁ todos sus cambios locales y BORRARÁ todos los archivos agregados desde la última confirmación en la rama.
  • Funciona solo con los nombres de las sucursales, por lo que puede revertir solo a la última confirmación en la rama de esta manera.

Encontré una manera mucho más conveniente y sencilla de lograr los resultados anteriores:

git add . && git reset --hard HEAD

donde HEAD apunta a la última confirmación en tu rama actual.

Es el mismo código que sugiere boulder_Ruby, pero he agregado git add . antes de git reset --hard HEAD para borrar todos los archivos nuevos creados desde la última confirmación, ya que esto es lo que la mayoría de la gente espera al volver a la última confirmación.

105
Roman Minenok

Puedes hacerlo mediante los siguientes dos comandos:

git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f

Se eliminará su anterior compromiso Git.

Si desea mantener sus cambios, también puede utilizar:

git reset --soft [previous Commit SHA id here]

Entonces guardará tus cambios.

94
kiran boghra

OK, volver a la confirmación anterior en git es bastante fácil ...

Revertir sin guardar los cambios:

git reset --hard <commit>

Volver atrás manteniendo los cambios:

git reset --soft <commit>

Explique: usando git reset, puede restablecer a un estado específico, es común usarlo con un hash de confirmación como se ve arriba.

Pero como ven, la diferencia es usar los dos indicadores --soft y --hard, por defecto git reset usando el --soft flag, pero es una buena práctica usar siempre el indicador, explico cada indicador:


--suave

El indicador predeterminado tal como se explica, no es necesario que lo proporcione, no cambia el árbol de trabajo, pero agrega todos los archivos de cambios listos para confirmar, por lo que regresa al estado de confirmación que los cambios a los archivos se desestabilizan.


--difícil

¡Tenga cuidado con esta bandera, restablece el árbol de trabajo y todos los cambios a los archivos rastreados y todo desaparecerá!


También creé la siguiente imagen que puede suceder en una vida real trabajando con git:

 git reset to a commit

63
Alireza

Nada aquí me funcionó aparte de esta combinación exacta:

git reset --hard <commit_hash>
git Push Origin <branch_name> --force

La clave aquí es forzar el Push, no hay mensajes adicionales de confirmación/confirmación, etc.

59
serdarsenay

Digamos que tienes las siguientes confirmaciones en un archivo de texto llamado ~/commits-to-revert.txt (usé git log --pretty=oneline para obtenerlas)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Cree un Bash Shell script para revertir cada uno de ellos:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

Esto hace que todo vuelva al estado anterior, incluidas las creaciones de archivos y directorios, y las eliminaciones, confírmelo en su sucursal y conservará el historial, pero lo ha vuelto a la misma estructura de archivos. Por qué Git no tiene un git revert --to <hash> está más allá de mí.

57
Lance Caraccioli

Alternativas extra a las soluciones de Jefromi

Las soluciones de Jefromi son definitivamente las mejores, y definitivamente debes usarlas. Sin embargo, en aras de la integridad, también quería mostrar estas otras soluciones alternativas que también se pueden usar para revertir un compromiso (en el sentido de que crea un nuevo compromiso que deshace los cambios en el compromiso anterior , solo como lo que hace git revert).

Para ser claros, estas alternativasno son la mejor manera de revertir los compromisos, Las soluciones de Jefromi son , pero solo quiero señalar que también puede utilizar estos otros métodos. para lograr lo mismo que git revert.

Alternativa 1: Reseteos duros y suaves

Esta es una versión muy ligeramente modificada de la solución de Charles Bailey para ¿Volver a un commit por un SHA hash en Git? :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}

# Commit the changes
git commit -m "Revert to <commit>"

Básicamente, esto funciona utilizando el hecho de que los reinicios suaves dejarán el estado de la confirmación previa en el índice/área de almacenamiento, que luego puede confirmar.

Alternativa 2: eliminar el árbol actual y reemplazarlo por uno nuevo

Esta solución proviene de la solución de svick para Revisar la confirmación antigua y hacerla una nueva confirmación :

git rm -r .
git checkout <commit> .
git commit

De manera similar a la alternativa # 1, esto reproduce el estado de <commit> en la copia de trabajo actual. Es necesario hacer primero git rm porque git checkout no eliminará los archivos que se han agregado desde <commit>.

56
user456814

Suponiendo que está hablando de maestro y de esa rama respectiva (dicho esto, esta podría ser cualquier rama de trabajo que le interese):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git Push -f Origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

Encontré la respuesta en una entrada de blog (ahora ya no existe)

Tenga en cuenta que esto es Restablecer y forzar el cambio en el control remoto, de modo que si otros miembros de su equipo ya lo han hecho, tendrá problemas. Estás destruyendo el historial de cambios, lo cual es una razón importante por la que la gente usa git en primer lugar.

Es mejor usar revertir (ver otras respuestas) que restablecer. Si eres un equipo de un solo hombre, entonces probablemente no importa.

55
markreyes

Aquí hay una forma mucho más simple para volver a un commit anterior (y tenerlo en un estado no comprometido, para hacer con él lo que quiera):

git reset HEAD~1

Por lo tanto, no hay necesidad de cometer IDs y así sucesivamente :)

51
Paul Walczewski

Después de todos los cambios, cuando presiona todos estos comandos, es posible que tenga que usar:

git Push -f ...

Y no solo git Push.

34
sivi

Hay un comando (que no forma parte del núcleo Git, pero está en el paquete git-extras ) específicamente para revertir y poner en escena las confirmaciones antiguas:

git back

Por la página de manual de , también se puede utilizar como tal:

# Remove the latest three commits
git back 3
33
Shadow Man

Puedes completar todos estos pasos iniciales tú mismo y presionar para volver a git repo.

  1. Obtenga la última versión de su repositorio de Bitbucket usando el comando git pull --all.

  2. Ejecute el comando git log con -n 4 desde su terminal. El número después de -n determina el número de confirmaciones en el registro a partir de la confirmación más reciente en su historial local.

    $ git log -n 4

  3. Reinicie el encabezado del historial de su repositorio utilizando el git reset --hard HEAD~N donde N es el número de confirmaciones que desea devolver. En el siguiente ejemplo, la cabecera se retrasaría un compromiso, al último compromiso en el historial del repositorio:

  4. Empuje el cambio a git repo usando git Push --force para forzar Empuje el cambio.

Si quieres git repositorio a un commit anterior

git pull --all
git reset --hard HEAD~1
git Push --force
29
Nanhe Kumar

Vuelva a más reciente confirme e ignore todos los cambios locales:

git reset --hard HEAD

Seleccione su compromiso requerido, y verifíquelo por

git show HEAD
git show HEAD~1
git show HEAD~2 

hasta que obtenga el compromiso requerido. Para hacer que el HEAD apunte a eso, haga

git reset --hard HEAD~1

o git reset --hard HEAD~2 o lo que sea.

26
tonythomas01

Esta es una forma más de restablecer directamente a un compromiso reciente

git stash
git stash clear

Borra directamente todos los cambios que ha estado realizando desde la última confirmación.

PD: tiene un pequeño problema; también elimina todos los cambios de almacenamiento almacenados recientemente. Que supongo que en la mayoría de los casos no debería importar.

20
Point Networks

Para mantener los cambios de la confirmación anterior a HEAD y pasar a la confirmación anterior, haga:

git reset <SHA>

Si no se requieren cambios de la confirmación anterior a HEAD y simplemente descarta todos los cambios, haz:

git reset --hard <SHA>
20
Vishnu Atrai

Para limpiar completamente el directorio de un codificador de algunos cambios accidentales, usamos:

git add -A .
git reset --hard HEAD

Solo git reset --hard HEAD eliminará las modificaciones, pero no eliminará los archivos "nuevos". En su caso, accidentalmente arrastraron una carpeta importante a algún lugar, y todos esos archivos fueron tratados como nuevos por Git, por lo que un reset --hard no lo solucionó. Al ejecutar el git add -A . de antemano, los rastreó explícitamente a todos con git, que se eliminará con el reinicio.

20
Chris Moschini

Creo que algunas personas pueden venir a esta pregunta queriendo saber cómo deshacer los cambios comprometidos que han hecho en su maestro, es decir, deshacerse de todo y volver a Origin/master, en cuyo caso, haga esto:

git reset --hard Origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-Origin-master

19
nevster

Revertir es el comando para deshacer las confirmaciones.

git revert <commit1> <commit2> 

Muestra:

git revert 2h3h23233

Es capaz de tomar rango desde HEAD como a continuación. Aquí 1 dice "revertir último cometer".

git revert HEAD~1..HEAD

y luego hacer git Push

16
Sireesh Yarlagadda

Revertir el compromiso más reciente:

git reset --hard HEAD

HEAD es simplemente una referencia al compromiso actual (más reciente) en la rama actual. Solo puede haber una HEAD en un momento dado.

Volver a un compromiso anterior: la forma más rápida de restaurar una versión anterior es usar el comando reset:

# Resets index to former commit
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

# Updates working copy to reflect the new commit
git reset --hard

Esto rebobinará su rama HEAD a la versión especificada. Todas las confirmaciones que vinieron después de esta versión se deshacen efectivamente; Su proyecto es exactamente como era en ese momento.

El comando de reinicio viene con un par de opciones, una de las más interesantes es la bandera --soft. Si lo usa en lugar de --hard, Git mantendrá todos los cambios en esos compromisos "no hechos" como modificaciones locales.

Restauración de una revisión en una Nueva sucursal local

Como se dijo, el uso del comando de reinicio en su rama HEAD es una acción bastante drástica: eliminará cualquier confirmación (en esta rama) que se produjo después de la revisión especificada. Si estás seguro de que esto es lo que quieres, todo está bien.

Sin embargo, también hay una forma más segura en caso de que prefiera dejar su rama HEAD intacta. Dado que las "sucursales" son tan baratas y fáciles en Git, podemos crear fácilmente una nueva sucursal que comience en esa antigua revisión:

git checkout -b old-project-state 0ad5a7a6

Normalmente, el comando de pago se usa para cambiar de rama. Sin embargo, al proporcionar el parámetro -b, también puede dejar que cree una nueva rama (denominada old-project-state en este ejemplo). Si no desea que se inicie en la actual HEAD revisión, también debe proporcionar un hash de confirmación: la revisión del proyecto anterior que queremos restaurar.

Ahora tiene una nueva rama llamada old-project-state que refleja la versión anterior de su proyecto - sin tocar ni eliminar ninguna otra confirmación o rama.

16
Lyes CHIOUKH

Si la situación es un urgente uno , y solo desea hacer lo que el interrogador preguntó en un rápido y sucio camino, asumiendo que su proyecto está en el directorio "mi proyecto":

  1. Copie todo el directorio y llámelo otra cosa, como "mi proyecto - copiar"

  2. Hacer:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

Luego tiene dos versiones en su sistema ... puede examinar, copiar o modificar archivos de interés, o lo que sea, de la confirmación anterior. Puede descartar completamente los archivos en "mi proyecto - copiar", si ha decidido que el nuevo trabajo no iría a ninguna parte ...

Lo obvio si desea continuar con el estado del proyecto sin descartar realmente el trabajo, ya que esta confirmación recuperada es renombrar su directorio nuevamente: elimine el proyecto que contiene la confirmación recuperada (o asígnele un nombre temporal) y cambie su nombre " mi proyecto - copia "directorio de nuevo a" mi proyecto ". Entonces, probablemente haga otro compromiso bastante pronto.

Git es una creación brillante, pero no puedes simplemente "recogerlo sobre la marcha": también las personas que intentan explicarlo con demasiada frecuencia asumir el conocimiento previo de otros VCS [Sistemas de control de versiones] y profundizar mucho demasiado profundo demasiado pronto, y cometer otros crímenes, como usar términos intercambiables para "verificar", en formas que a veces parecen casi calculadas para confundir a un principiante.

Para ahorrarte mucho estrés, tienes que leer un libro sobre Git (recomiendo "Control de versiones con Git" . Y si puedes confiar en mí (o más bien en mis cicatrices) cuando digo "tengo que hacerlo", se deduce que también podrías hacerloAHORA. Gran parte de la complejidad de Git proviene de la ramificación y luego de la fusión. Pero a partir de tu pregunta hay no hay razón por la que la gente debería estar cegándote con la ciencia .

¡Especialmente si, por ejemplo, esta es una situación desesperada y eres un novato con Git!

PD: otro pensamiento: es (ahora) en realidad bastante simple mantener el repositorio Git ("repo") en un directorio diferente al que contiene los archivos de trabajo. Esto significaría que no tendría que copiar todo el repositorio de Git utilizando la solución rápida y sucia de arriba. Vea la respuesta de Fryer usando --separate-git-dir aquí . Tenga cuidado , aunque: si tiene un repositorio de "directorio separado" que no copia, y realiza un restablecimiento completo, todas las versiones posteriores a la confirmación de restablecimiento se perderán para siempre, a menos que tenga , como absolutamente debería, haga una copia de seguridad de su repositorio, preferiblemente en la nube (por ejemplo, Google Drive ) entre otros lugares.

13
mike rodent

Intente restablecer el compromiso deseado -

git reset <COMMIT_ID>

(para verificar COMMIT_ID use git log)

Esto restablecerá todos los archivos modificados al estado sin agregar.

Ahora puedes checkout todos los archivos sin agregar por

git checkout .

Compruebe git log para verificar sus cambios.

ACTUALIZACI&OACUTE;N

Si tiene one and only commit en su repositorio, intente

git update-ref -d HEAD

13
optimistanoop

¡Precaución! Este comando puede causar la pérdida del historial de confirmación, si el usuario coloca la confirmación errónea por error. Siempre tenga una copia de seguridad adicional de su git en algún otro lugar, en caso de cometer errores, entonces estará un poco más seguro. :)

He tenido un problema similar y quise volver al Commit anterior. En mi caso, no fui designado para mantener un compromiso más nuevo, por lo tanto, utilicé Hard.

Así es como lo hice:

git reset --hard CommitId && git clean -f

Esto revertirá en el repositorio local, aquí después de usar git Push -f actualizará el repositorio remoto.

git Push -f
11

Como sus confirmaciones se empujan de forma remota, debe eliminarlos. Déjame asumir que tu rama está desarrollada y es empujada sobre Origen.

Primero necesitas eliminar el desarrollo de origen:

git Push Origin :develop (note the colon)

Entonces necesita desarrollar el estado que desea, déjeme asumir que el hash de confirmación es EFGHIJK:

git reset --hard EFGHIJK

Por último, Push se desarrolla de nuevo:

git Push Origin develop
11
George Ninan

En GitKraken puedes hacer esto:

  1. Haga clic derecho en la confirmación que desea restablecer, elija: Restablecer esta confirmación/Duro:

 enter image description here

  1. Haga clic con el botón derecho en la confirmación nuevamente, elija: nombre de rama actual/inserción:

 enter image description here

  1. Haga clic en el Force Push:

 enter image description here

Obs. : Debe cuidarse porque todo el historial de confirmación después del restablecimiento completo se pierde y esta acción es irreversible. Necesitas estar seguro de lo que estás haciendo.

10
Ângelo Polotto

Si desea corregir algún error en la última confirmación, una buena alternativa sería usar git commit --amend command. Si la última confirmación no es señalada por ninguna referencia, esto hará el truco, ya que creará una confirmación con el mismo padre que la última confirmación. Si no hay ninguna referencia al último compromiso, simplemente se descartará y este compromiso será el último compromiso. Esta es una buena manera de corregir las confirmaciones sin revertir las confirmaciones. Sin embargo tiene sus propias limitaciones.

10
Upul Doluweera

Primero, obtenga la cadena que identifica la confirmación en alguna fecha, haciendo:

git rev-list -n 1 --before="2009-07-27 13:37" Origin/master

imprime el identificador de confirmación, toma la cadena (por ejemplo, XXXX) y haz:

git checkout XXXX
9
Luca C.

Para revertir (o revertir):

  1. git revert --no-commit "commit-code-to-remove" HEAD (por ejemplo, git revert --no-commit d57a39d HEAD)
  2. git commit
  3. git push

Pruebe los dos pasos anteriores, y si encuentra que esto es lo que desea, entonces git Push.

Si encuentras algo mal hazlo:

git revert --abort

9
Jagraj Singh

Se puede hacer mucho más fácil con SourceTree . Simplemente haga clic con el botón derecho del mouse que está buscando y seleccione 'Pagar' en el menú.

 enter image description here

8
Marcin Szymczak

Otra solución más simple; tienes que cambiar de rama para hacer esto, pero después puedes simplemente ejecutar:

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
8
Aif

No pude revertir el mío manualmente por alguna razón, así que aquí es cómo terminé haciéndolo.

  1. Revisé la sucursal que quería tener, la copié.
  2. Revisé la última sucursal.
  3. Copié los contenidos de la sucursal que deseaba en el directorio de la última sucursal, sobrescribiendo los cambios y confirmando eso.
7
Demodave
git reflog

Elija el número de la (s) CABEZA (s) de git reflog, donde desea revertir y hacer (para este ejemplo elijo el 12):

git reset [email protected]{12} --hard
7
Sérgio

La forma menos complicada de revertir una rama a cualquier confirmación en particular donde no puede cambiar el historial que he encontrado es:

  1. compruebe el compromiso o la rama de su deseo para revertir.
  2. Edite .git/HEAD y cambie la referencia a la rama a la que desea volver.

Como:

echo 'ref: refs/heads/example' > .git/HEAD

Si luego realiza el estado de git, debería ver todos los cambios entre la rama en la que se encuentra y la que desea revertir.

Si todo se ve bien puedes comprometerte. También puedes usar git diff revert..example para asegurarte de que sea igual.

6
jgmjgm

Si quieres revertir temporalmente los cambios porque

  • alguien confirmó el código que está rompiendo la compilación o rompiendo la funcionalidad en la que estás trabajando

Puede buscar la última confirmación de trabajo utilizando git log y luego ejecutar

git rebase --onto <commitId>

Cuando la rama remota vuelva a funcionar, puede

git pull --rebase

Este método es mejor que git checkout para cambios temporales, porque no está en un estado separado.

5
joseph

Restablecimiento de cambios por etapas y compromisos

El comando git reset le permite cambiar el HEAD: la última confirmación de su árbol de trabajo apunta a su repositorio. Modifica el área de preparación o el área de preparación y el árbol de trabajo. La capacidad de Git para elaborar compromisos exactamente como usted quiere significa que a veces necesita deshacer cambios en los cambios realizados con git add. Puedes hacerlo llamando a git reset HEAD <file to change>. Tienes dos opciones para deshacerte completamente de los cambios. git checkout HEAD <file(s) or path(s)> es una forma rápida de deshacer los cambios en su área de preparación y en el árbol de trabajo. Tenga cuidado con este comando, sin embargo, porque elimina todos los cambios en su árbol de trabajo. Git no conoce esos cambios ya que nunca se han cometido. No hay forma de recuperar esos cambios una vez que ejecute este comando. Otro comando a su disposición es git reset --hard. Es igualmente destructivo para su árbol de trabajo: cualquier cambio no confirmado o cambios por etapas se pierden después de ejecutarlo. Ejecutar git reset -hard HEAD hace lo mismo que git checkout HEAD. simplemente no requiere un archivo o ruta para trabajar. Puede usar --soft con git reset. Restaura el repositorio a la confirmación que especifique y establece todos esos cambios. Los cambios que ya haya realizado no se verán afectados, ni tampoco los cambios en su árbol de trabajo. Finalmente, puede usar --mixed para restablecer el árbol de trabajo sin configurar los cambios. Esto también elimina los cambios en etapas.

Devolviendo Comisiones

A veces cometemos errores. Un compromiso que se suponía que no debía compartirse se transfiere a un repositorio público, un compromiso tiene un error que no se puede corregir y debe deshacerse, o tal vez ya no necesite ese código. Todos estos casos llame a git revert. El comando git revert hace exactamente lo que puede esperar. Revierte una única confirmación aplicando una confirmación inversa al historial. A veces, debe revertir varias confirmaciones para deshacer un cambio por completo. Puede usar -no-commit, o puede usar -n para decirle a Git que realice la reversión, pero no llegue a confirmar el cambio. Esto le permite combinar todas las confirmaciones de reversión en una confirmación, lo cual es útil si necesita revertir una característica que abarca varias confirmaciones. Asegúrese de revertir las confirmaciones en orden inverso: la confirmación más reciente primero. De lo contrario, puedes confundir a Git al intentar revertir el código que aún no existe.

2
SAIguru011