Comprueba la confirmación antigua y conviértela en una nueva confirmación [duplicado]


Esta pregunta ya tiene una respuesta aquí:

En Git, digamos que estropeo mis confirmaciones, y quiero hacer la versión 3 hace confirmaciones como la nueva versión. Si hago git checkout xxxx, crea una nueva rama y parece que sólo puedo combinar? ¿Podría hacer de este el nuevo " maestro versión"?

Quiero:

A-B-C-D-E

Para convertirse en

A-B-C-D-E-F

Donde F tiene exactamente el mismo contenido que C

Si utilizo git revert xxxx en su lugar, parece que definitivamente tendrá conflictos y necesito resolverlo manualmente.

Lo que realmente quiero es hacer de la antigua confirmación en algún momento la nueva confirmación, independientemente de lo que esté en mi directorio de trabajo o la última confirmación.

¿Cómo podría hacer esto?

 174
git
Author: Arslan Ali, 2010-08-01

6 answers

git rm -r .
git checkout HEAD~3 .
git commit

Después de la confirmación, los archivos en el nuevo HEAD serán los mismos que en la revisión HEAD~3.

 191
Author: svick,
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-08-01 13:46:36

Suena como si solo quisieras resetear a C; es decir hacer el árbol:

A-B-C

Puedes hacer eso con reset:

git reset --hard HEAD~3

(Nota: Usted dijo que hace tres confirmaciones, así que eso es lo que escribí; en su ejemplo C es solo hace dos confirmaciones, por lo que es posible que desee utilizar HEAD~2)


También puedes usar revert si quieres, aunque por lo que sé necesitas hacer las reversiones una a la vez:

git revert HEAD     # Reverts E
git revert HEAD~2   # Reverts D

Que creará un nuevo commit F que es el mismo contenido como D, y G es el mismo contenido que C. Puedesrebase aplastarlos juntos si quieres

 29
Author: Michael Mrozek,
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-08-01 05:05:00

Esto es exactamente lo que quería hacer. No estaba seguro del comando anterior git cherry-pick C, suena bien pero parece que haces esto para obtener cambios de otra rama pero no en la misma rama, ¿alguien lo ha probado?

Así que hice algo más que también funcionó : Tengo los archivos que quería de vuelta de la antigua confirmación archivo por archivo

git checkout <commit-hash> <filename>

Ex : git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css

- > esto toma los archivos como eran de la antigua confirmación

Entonces hice mis cambios. Y me comprometí nuevo.

git status (to check which files were modified)
git diff (to check the changes you made)
git add .
git commit -m "my message"

Revisé mi historial con git log, y todavía tengo mi historial junto con mis nuevos cambios realizados desde los archivos antiguos. Y yo también podría empujar.

Tenga en cuenta que para volver al estado que desea necesita poner el hash de la confirmación antes de los cambios no deseados. También asegúrese de que no tiene cambios no comprometidos antes de hacer eso.

 16
Author: eloone,
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
2013-01-16 16:03:03

Eloone lo hizo archivo por archivo con

git checkout <commit-hash> <filename>

Pero usted podría checkout todos los archivos más fácilmente haciendo

git checkout <commit-hash> .
 13
Author: Nick Weisser,
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
2013-05-30 12:49:44

git cherry-pick C

Donde C es el hash de confirmación para C. Esto aplica la confirmación antigua encima de la más reciente.

 6
Author: Adrian Parsons,
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
2013-01-14 21:36:20

Las otras respuestas hasta ahora crean nuevas confirmaciones que deshacen lo que está en confirmaciones anteriores. Es posible volver atrás y "cambiar la historia" por así decirlo, pero esto puede ser un poco peligroso. Deberías solo hacer esto si el commit que estás cambiando no ha sido enviado a otros repositorios.

El comando que estás buscando es git rebase --interactive

Si desea cambiar HEAD~3, el comando que desea emitir es git rebase --interactive HEAD~4. Esto abrirá un editor de texto y le permitirá especificar qué confirmaciones desea cambiar.

Practique en un repositorio diferente antes de probar esto con algo importante. Las páginas de manual deben darle todo el resto de la información que necesita.

 2
Author: haydenmuhl,
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-08-01 16:32:08