git - tag - Pagar el compromiso anterior y convertirlo en un nuevo commit
qué tipos de etiquetas existen en git (6)
Esta pregunta ya tiene una respuesta aquí:
En Git, digo que estropeé mis compromisos, y quiero hacer que la versión 3 se comprometa como la nueva versión. Si hago git checkout xxxx
, crea una nueva rama y parece que solo puedo fusionarla? ¿Podría hacer de esto la nueva "versión maestra"?
Yo quiero:
A-B-C-D-E
convertirse
A-B-C-D-E-F
donde F tiene exactamente el mismo contenido que C
Si utilizo git revert xxxx
, parece que definitivamente tendrá conflictos y necesito resolverlo manualmente.
Lo que realmente quiero es solo hacer el compromiso anterior en algún punto de la nueva confirmación, independientemente de lo que haya en mi directorio de trabajo o la última confirmación.
¿Cómo voy a hacer esto?
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 intentado?
Así que hice otra cosa que también funcionó: obtuve por archivo los archivos que quería volver del antiguo archivo de confirmación
git checkout <commit-hash> <filename>
ex: git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css
-> esto toma los archivos tal como estaban del antiguo compromiso
Luego hice mis cambios. Y me comprometí de nuevo.
git status (to check which files were modified)
git diff (to check the changes you made)
git add .
git commit -m "my message"
Comprobé mi historial con git log
, y todavía tengo mi historial junto con mis nuevos cambios realizados a partir de los archivos antiguos. Y yo podría empujar también.
Tenga en cuenta que para volver al estado que desea, debe colocar el hash de la confirmación antes de los cambios no deseados. También asegúrese de no tener cambios no confirmados antes de hacerlo.
Las otras respuestas hasta ahora crean nuevas confirmaciones que deshacen lo que está en las confirmaciones más antiguas. Es posible volver atrás y "cambiar el historial" por así decirlo, pero esto puede ser un poco peligroso. Solo debe hacer esto si la confirmación que está modificando no se ha 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 intentar esto con algo importante. Las páginas de manual deberían proporcionarle todo el resto de la información que necesita.
Parece que solo quieres restablecer a C; eso es hacer el árbol:
A B C
Puedes hacer eso con reset
:
git reset --hard HEAD~3
(Nota: dijiste que hace tres commits, así que eso es lo que escribí, en tu ejemplo, C hace solo dos commits, por lo que es posible que desees utilizar HEAD~2
)
También puede usar revert
si lo desea, aunque por lo que sé que necesita hacer, lo revierte de a uno por vez:
git revert HEAD # Reverts E
git revert HEAD~2 # Reverts D
Eso creará un nuevo compromiso F que tiene el mismo contenido que D, y G tiene el mismo contenido que C. Puedes rebase
a rebase
para aplastarlos si quieres
eloone lo hizo archivo por archivo con
git checkout <commit-hash> <filename>
pero puedes sacar todos los archivos más fácilmente haciendo
git checkout <commit-hash> .
git cherry-pick C
donde C es el hash de confirmación para C. Esto aplica el compromiso anterior sobre el más nuevo.
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
.