Ho appena letto la modifica di un singolo file in un commit passato in git, ma sfortunatamente la soluzione accettata "riordina" i commit, che non è quello che voglio. Quindi ecco la mia domanda:
Di tanto in tanto, noto un bug nel mio codice mentre lavoro su una funzionalità (non correlata). Una rapida git blame
quindi rivela che il bug è stato introdotto alcuni commit fa (mi impegno parecchio, quindi di solito non è il commit più recente che ha introdotto il bug). A questo punto, di solito faccio questo:
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
Tuttavia, questo accade così spesso che la sequenza di cui sopra sta diventando fastidiosa. Soprattutto il "rebase interattivo" è noioso. C'è qualche scorciatoia per la sequenza di cui sopra, che mi consente di modificare un commit arbitrario in passato con le modifiche graduali? Sono perfettamente consapevole che questo cambia la storia, ma faccio errori così spesso che mi piacerebbe davvero avere qualcosa di simile
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.
Forse uno script intelligente in grado di riscrivere i commit utilizzando strumenti idraulici o giù di lì?
rebase -i
?
rebase --onto tmp bad-commit master
. Come scritto, proverà ad applicare il bad commit allo stato di commit fisso.