Acabei de ler a alteração de um único arquivo em um commit anterior no git, mas infelizmente a solução aceita 'reordena' os commits, que não é o que eu quero. Então aqui está minha pergunta:
De vez em quando, percebo um bug no meu código enquanto trabalho em um recurso (não relacionado). Um rápido git blame
então revela que o bug foi introduzido há alguns commits atrás (eu faço vários commits, então geralmente não é o commit mais recente que introduziu o bug). Nesse ponto, geralmente faço o seguinte:
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
No entanto, isso acontece com tanta frequência que a sequência acima está ficando irritante. Especialmente o 'rebase interativo' é enfadonho. Existe algum atalho para a sequência acima, o que me permite corrigir um commit arbitrário no passado com as mudanças encenadas? Estou perfeitamente ciente de que isso muda a história, mas estou cometendo erros com tanta frequência que adoraria ter 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.
Talvez um script inteligente que pode reescrever commits usando ferramentas de encanamento ou algo assim?
rebase -i
?
rebase --onto tmp bad-commit master
. Conforme está escrito, ele tentará aplicar o commit incorreto ao estado de commit fixo.