我用过另一种方法几次。事实上,它是一个手动的git rebase -i,当你想重新安排几个提交,包括压缩或分割一些提交时,它很有用。主要的优点是,您不必在某个时刻决定每个提交的命运。在这个过程中,你还可以使用所有的Git特性,而不是在重基过程中。例如,您可以在任何时候显示原始和重写的历史记录的日志,甚至可以进行另一次重基!
我将以以下方式引用提交,因此它易于阅读:
C # good commit after a bad one
B # bad commit
A # good commit before a bad one
你的历史一开始是这样的:
x - A - B - C
| |
| master
|
origin/master
我们将以这种方式重新创建它:
x - A - B*- C'
| |
| master
|
origin/master
过程
git checkout B # get working-tree to the state of commit B
git reset --soft A # tell Git that we are working before commit B
git checkout -b rewrite-history # switch to a new branch for alternative history
现在使用git add (git add -i, git stash等)改进你的旧提交。你甚至可以把你的旧提交分成两个或更多。
git commit # recreate commit B (result = B*)
git cherry-pick C # copy C to our new branch (result = C')
中间结果:
x - A - B - C
| \ |
| \ master
| \
| B*- C'
| |
| rewrite-history
|
origin/master
让我们完成:
git checkout master
git reset --hard rewrite-history # make this branch master
或者只使用一个命令:
git branch -f master # make this place the new tip of the master branch
好了,现在你可以继续前进了。
最后一个任务是删除临时分支:
git branch -d rewrite-history