Как я могу легко исправить прошлый коммит? - PullRequest
95 голосов
/ 23 июня 2010

Я только что прочитал внесение изменений в один файл в прошлом коммите в git , но, к сожалению, принятое решение «переупорядочивает» коммиты, а это не то, что мне нужно. Итак, вот мой вопрос:

Время от времени я замечаю ошибку в своем коде, работая над (не связанной) функцией. Быстрый git blame затем показывает, что ошибка была введена несколько коммитов назад (я фиксирую довольно много, поэтому обычно это не последний коммит, который представил ошибку). В этот момент я обычно делаю это:

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

Однако это происходит так часто, что приведенная выше последовательность становится раздражающей. Особенно «интерактивный ребаз» скучен. Есть ли какой-нибудь ярлык для вышеуказанной последовательности, который позволяет мне дополнить произвольный коммит в прошлом поэтапными изменениями? Я прекрасно понимаю, что это меняет историю, но я делаю ошибки так часто, что мне бы очень хотелось иметь что-то вроде

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.

Может быть, умный сценарий, который может переписать коммиты с помощью сантехнических инструментов или около того?

Ответы [ 11 ]

0 голосов
/ 11 августа 2010

Я не знаю об автоматическом способе, но вот решение, которое может быть проще для человека:

git stash
# write the patch
git add -p <file>
git commit -m"whatever"   # message doesn't matter, will be replaced via 'fixup'
git rebase -i <bad-commit-id>~1
# now cut&paste the "whatever" line from the bottom to the second line
# (i.e. below <bad-commit>) and change its 'pick' into 'fixup'
# -> the fix commit will be merged into the <bad-commit> without changing the
# commit message
git stash pop
...