Revertir a una confirmación Git antigua en un repositorio público


¿Cómo puedo volver a una confirmación específica en git?

La mejor respuesta que alguien podría darme era usar git revert X veces hasta que alcance el commit deseado.

Así que digamos que quiero volver a una confirmación que tiene 20 confirmaciones antiguas, tendría que ejecutarla 20 veces.

Hay una manera más fácil de hacer esto?

No puedo usar reset porque este repositorio es público.

Author: David, 2010-01-05

8 answers

Prueba esto:

git checkout [revision] .

Donde [revision] es el hash de confirmación (por ejemplo: 12345678901234567890123456789012345678ab).

No olvides el . al final, muy importante. Esto aplicará cambios a todo el árbol. Deberías ejecutar este comando en la raíz del proyecto git. Si está en cualquier subdirectorio, entonces este comando solo cambia los archivos en el directorio actual. Entonces comprométete y deberías ser bueno.

Puede deshacer esto mediante

git reset --hard 

Que eliminará todas las modificaciones del directorio de trabajo y el área de preparación.

 926
Author: Alex Reisner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-19 08:32:39

Para revertir a un commit específico:

git reset --hard commit_sha

Para revertir 10 confirmaciones:

git reset --hard HEAD~10

Puedes usar "git revert" como en el siguiente post si no quieres reescribir el historial

¿Cómo revertir el repositorio Git a una confirmación anterior?

 159
Author: Naga Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:31

Bueno, supongo que la pregunta es, ¿qué quieres decir con 'retroceder'? Si no puedes reset porque es público y quieres mantener intacto el historial de confirmaciones, ¿quieres decir que solo quieres que tu copia de trabajo refleje una confirmación específica? Use git checkout y el hash de confirmación.

Editar: Como se señaló en los comentarios, usar git checkout sin especificar una rama te dejará en un estado "sin rama". Use git checkout <commit> -b <branchname> para pasar a una rama, o git checkout <commit> . para pasar a la rama actual.

 76
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-05 17:26:45

El póster original dice:

La mejor respuesta que alguien podría darme era usar git revert X veces hasta que alcanza el commit deseado.

Así que digamos que quiero volver a un commit que tiene 20 commits de edad, tendría para ejecutarlo 20 veces.

Hay una manera más fácil de hacer esto?

No puedo usar reset porque este repositorio es público.

No es necesario usar git revert X veces. git revert puede aceptar un rango de confirmación como un argumento, por lo que solo necesita usarlo una vez para revertir un rango de confirmaciones. Por ejemplo, si desea revertir las últimas 20 confirmaciones:

git revert --no-edit HEAD~20..

El rango de confirmación HEAD~20.. es la abreviatura de HEAD~20..HEAD, y significa "comenzar desde el padre 20 th de la confirmación de HEAD, y revertir todas las confirmaciones después de ella hasta HEAD".

Que revertirá los últimos 20 commits, suponiendo que ninguno de ellos se fusionan cometer. Si hay confirmaciones de fusión, entonces no puede revertirlas todas en un comando, tendrá que revertirlos individualmente con

git revert -m 1 <merge-commit>

Tenga en cuenta también que he probado usando un rango con git revert usando la versión 1.9.0 de git. Si estás usando una versión anterior de git, usar un rango con git revert puede o no funcionar.

git revert Es Mejor Que git checkout

Tenga en cuenta que a diferencia de esta respuesta que dice usar git checkout, git revert en realidad, eliminará cualquier archivo que se haya agregado en cualquiera de las confirmaciones que revirtiendo , lo que hace esta es la forma correcta de revertir un rango de revisiones.

Documentación

 36
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:01

Paso 1: obtener la lista de confirmaciones:

git log

Obtendrá una lista como en este ejemplo:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <[email protected]>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <[email protected]>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <[email protected]>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

Paso 2: copia el hash de confirmación necesario y pégalo para el pago:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

Eso es todo.

 20
Author: Igor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-22 11:12:36
git read-tree -um @ $commit_to_revert_to

Lo hará. Es "git checkout" pero sin actualizar HEAD.

Puede lograr el mismo efecto con

git checkout $commit_to_revert_to
git reset --soft @{1}

Si prefiere encadenar comandos de conveniencia juntos.

Estos te dejan con tu worktree e index en el estado deseado, puedes simplemente git commit para terminar.

 8
Author: jthill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-06 20:14:32

No estoy seguro de qué ha cambiado, pero no puedo realizar una confirmación específica sin la opción --detach. El comando completo que funcionó para mí fue: git checkout --detach [commit hash]

Para volver del estado desapegado tuve que revisar mi sucursal local: git checkout master

 1
Author: ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 11:59:02

Digamos que trabajas en un proyecto y después de un día más o menos. Te das cuenta de que una característica todavía te está dando errores. Pero no sabes qué cambio hiciste que causó el error. Así que tienes que pescar confirmaciones de trabajo anteriores. Para volver a un commit específico:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Ok, así que commit funciona para ti. No más errores. Usted identificó el problema. Ahora puedes volver a la última confirmación:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

Y checkout un archivo específico antes de que causara el error (en mi caso utilizo ejemplo Gemfile.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

Y esta es una forma de manejar los errores que ha creado en las confirmaciones sin darse cuenta de los errores hasta más tarde.

 0
Author: Donato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-21 21:03:52