Acabo de leer la modificación de un solo archivo en una confirmación anterior en git, pero desafortunadamente la solución aceptada 'reordena' las confirmaciones, que no es lo que quiero. Entonces esta es mi pregunta:
De vez en cuando, noto un error en mi código mientras trabajo en una función (no relacionada). git blame
Luego, un rápido revela que el error se introdujo hace algunas confirmaciones (yo comprometo bastante, por lo que generalmente no es la confirmación más reciente la que introdujo el error). En este punto, suelo hacer esto:
git stash # temporarily put my work aside
git rebase -i <bad_commit>~1 # rebase one step before the bad commit
# mark broken commit for editing
vim <affected_sources> # fix the bug
git add <affected_sources> # stage fixes
git commit -C <bad_commit> # commit fixes using same log message as before
git rebase --continue # base all later changes onto this
Sin embargo, esto sucede con tanta frecuencia que la secuencia anterior se vuelve molesta. Especialmente la 'rebase interactiva' es aburrida. ¿Hay algún atajo a la secuencia anterior, que me permita modificar una confirmación arbitraria en el pasado con los cambios por etapas? Soy perfectamente consciente de que esto cambia la historia, pero cometo errores con tanta frecuencia que me encantaría tener algo como
vim <affected_sources> # fix bug
git add -p <affected_sources> # Mark my 'fixup' hungs for staging
git fixup <bad_commit> # amend the specified commit with staged changes,
# rebase any successors of bad commit on rewritten
# commit.
¿Quizás un script inteligente que pueda reescribir confirmaciones usando herramientas de plomería o algo así?
rebase -i
?
rebase --onto tmp bad-commit master
. Como está escrito, intentará aplicar el compromiso incorrecto al estado de compromiso fijo.