Cómo usar Git Revert

107

¿Cómo se git revertusa?

Esto puede sonar como una pregunta duplicada, pero cuando la gente lo hace, la respuesta suele ser, ¿usar git resetsegún Revertir a una confirmación por un hash SHA en Git?

Luego, cuando alguien pregunta cómo usar, la git resetgente responde diciendo que debe usar git revertsegún Git: cómo revertir

Antes de que te des cuenta, aparecieron 8 personas diferentes con sus propias formas únicas de salvar el trasero del OP, todo lo cual está sobre tu cabeza.

Así que intentemos ceñirnos al escrito y escribir una guía para principiantes git revert.

Un escenario: te has comprometido dos veces a dominar y es malo. Has presionado y otras personas tienen tus malos cambios.

Quieres deshacerlo. No es algo que pueda deshacer manualmente en el código usted mismo, digamos que algún asistente o administrador de paquetes cambió toneladas de cosas por todas partes, solo quiere dejarlo todo como estaba.

De esto se trata el control de fuente. Estoy seguro de que es fácil.

Está bien, lo vas a usar git revertpero ¿cómo?

¿Y después de correr git reverttienes que hacer algo más después? ¿Tiene que confirmar los cambios revertidos o revertir directamente al repositorio o qué?

Obviamente, tendrás que presionar de nuevo y probablemente anunciar tus bolas al equipo.

Luke Puplett
fuente

Respuestas:

119

git revert realiza una nueva confirmación

git revert simplemente crea una nueva confirmación que es lo opuesto a una confirmación existente.

Deja los archivos en el mismo estado que si la confirmación que se ha revertido nunca existiera. Por ejemplo, considere el siguiente ejemplo simple:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

En este ejemplo, el historial de confirmaciones tiene dos confirmaciones y la última es un error. Usando git revert:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

Habrá 3 confirmaciones en el registro:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

Entonces, hay un historial consistente de lo que sucedió, pero los archivos son como si la actualización incorrecta nunca hubiera ocurrido:

cat README.md 
Initial text

No importa en qué parte del historial se encuentre la confirmación que se va a revertir (en el ejemplo anterior, la última confirmación se revierte; cualquier confirmación se puede revertir).

Preguntas de cierre

¿tienes que hacer algo más después?

A git revertes solo otra confirmación, por ejemplo, presione el control remoto para que otros usuarios puedan extraer / recuperar / fusionar los cambios y listo.

¿Tiene que confirmar los cambios revert realizados o revert se compromete directamente con el repositorio?

git revert es una confirmación: no hay pasos adicionales asumiendo que revertir una única confirmación es lo que deseaba hacer.

Obviamente, tendrás que presionar nuevamente y probablemente anunciarlo al equipo.

De hecho, si el control remoto está en un estado inestable, comunicar al resto del equipo que deben tirar para obtener la solución (el compromiso de reversión) sería lo correcto :).

AD7six
fuente
A modo de confirmación, tanto para la primera declaración aquí como para cualquiera que se pregunte lo mismo, me pregunté cómo funciona, puede revertir una reversión, donde hay varias confirmaciones nuevas desde la reversión que está revertiendo. Así que revertir es solo una confirmación de lo contrario de la confirmación revertida. Puede que, por supuesto, tenga conflictos ... pero esa es una historia diferente.
GG2
Siempre me parece mejor evitar comprometerme con él, solo para revisar los cambios primero y lo uso, git revert -n <commitToRevet> o git revert --no-commit <commitToRevet>
Eklavyaa
2
Solo quería decir que después de años en stackoverflow, creo que esta puede ser una de las mejores respuestas que he encontrado. Gran ejemplo y explicación Gracias.
user3344977
Entré aquí esperando obtener más información, algo así como un TLDR de este raw.githubusercontent.com/git/git/master/Documentation/howto/…
wviana
1
@wviana Si la información que ha encontrado es insuficiente, escriba una respuesta. Tenga en cuenta que el desbordamiento de pila no sustituye a la documentación oficial (a la que parece estar vinculando y cubre un alcance mucho más amplio que esta pregunta).
AD7six
35

Usa git revert así:

git revert <insert bad commit hash here>

git revertcrea una nueva confirmación con los cambios que se deshacen. git resetborra tu historial de git en lugar de realizar una nueva confirmación.

Los pasos posteriores son los mismos que para cualquier otra confirmación.

Johnny Z
fuente
La diferencia entre "revertir una confirmación" y "revertir a una confirmación" es lo suficientemente sutil como para que haya luchado con este comando durante años. Tu explicación me lo resolvió al instante. ¡Gracias!
claviska
24

La razón resety reverttienden a surgir mucho en las mismas conversaciones es porque diferentes sistemas de control de versiones los usan para significar cosas diferentes.

En particular, las personas que están acostumbradas a SVN o P4 que quieren deshacerse de los cambios no confirmados en un archivo, a menudo buscarán revertantes de que se les diga lo que realmente quieren reset.

De manera similar, el revertequivalente en otros VCSes a menudo se llama rollbacko algo similar, pero "rollback" también puede significar "Quiero descartar por completo las últimas confirmaciones", lo cual es apropiado para resetpero no revert. Por lo tanto, existe mucha confusión cuando las personas saben lo que quieren hacer, pero no tienen claro qué comando deberían usar para ello.

En cuanto a sus preguntas reales sobre revert ...

De acuerdo, vas a usar git revert, pero ¿cómo?

git revert first-bad-commit..last-bad-commit

Y después de ejecutar git revert, ¿tienes que hacer algo más después? ¿Tiene que confirmar los cambios revertidos o revertir directamente al repositorio o qué?

De forma predeterminada, le git revertsolicita un mensaje de confirmación y luego confirma los resultados. Esto se puede anular. Cito la página del manual :

--editar

Con esta opción, git revert te permitirá editar el mensaje de confirmación antes de realizar la reversión. Este es el valor predeterminado si ejecuta el comando desde una terminal.

--no comprometerse

Por lo general, el comando crea automáticamente algunas confirmaciones con mensajes de registro de confirmaciones que indican qué confirmaciones se revertieron. Esta bandera aplica los cambios necesarios para revertir las confirmaciones nombradas a su árbol de trabajo y al índice, pero no realiza las confirmaciones. Además, cuando se usa esta opción, su índice no tiene que coincidir con la confirmación HEAD. La reversión se realiza contra el estado inicial de su índice.

Esto es útil cuando se revierte el efecto de más de una confirmación en su índice en una fila.

En particular, de forma predeterminada crea una nueva confirmación para cada confirmación que está revirtiendo. Puede usar revert --no-commitpara crear cambios revertirlos todos sin realizar esos cambios como confirmaciones individuales, luego realizar la confirmación cuando lo desee.

Rana Tóxica
fuente
git revert first-bad-commit..last-bad-commit: Creo que esto debería ser git revert parent-of-first-bad-commit..last-bad-commit.
user1071847
9

La pregunta es bastante antigua pero revertir todavía confunde a la gente (como yo)

Como principiante, después de algunas pruebas y errores (más errores que pruebas), tengo un punto importante:

  • git revertrequiere la identificación de la confirmación que desea eliminar manteniéndola en su historial

  • git resetrequiere la confirmación que desea mantener y, en consecuencia, eliminará cualquier cosa posterior del historial.

Es decir, si usa revertcon la primera identificación de confirmación, se encontrará en un directorio vacío y una confirmación adicional en el historial, mientras que con el reinicio su directorio será ... revertido a la confirmación inicial y su historial se volverá como si las últimas confirmaciones nunca sucedieron.

Para ser aún más claro, con un registro como este:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

El uso git revert cb76ee4traerá de forma predeterminada sus archivos a 01b56c6 y agregará una confirmación adicional a su historial:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 en su lugar, devolverá sus archivos a 01b56c6 y limpiará cualquier otra confirmación posterior de su historial:

01b56c6 test
2e407ce first commit

Sé que estos son "la base", pero fue bastante confuso para mí, al ejecutar la revertprimera identificación ('primer compromiso') esperaba encontrar mis archivos iniciales, me tomó un tiempo entender que si necesita sus archivos de vuelta como 'primer compromiso', debe usar la siguiente identificación.

nnsense
fuente
Yo he observado lo mismo. es realmente confuso pero muy importante saberlo. Recientemente tuve que ayudar a un compañero de trabajo y me olvidé de esto. Eso fue un poco vergonzoso.
ExOfDe
1

Revertí algunas confirmaciones ejecutando 'git revert commit id' como:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

Luego se me pidió que confirmara la reversión (tal como lo haría al ejecutar 'git commit'). Mi programa de terminal predeterminado es Vim, así que ejecuté:

:wq 

Finalmente empujé el cambio al repositorio con:

git push
jrc16
fuente