乐者为王

Do one thing, and do it well.

Git笔记之rebase --onto

有的时候,可能需要修改某个已提交commit。如果是修改最近提交的commit,可以使用git commit --amend命令;如果是修改更早提交的commit,可以使用git rebase -i HEAD~n。不过这个命令有个缺陷,就是不能修改最早提交的那个commit。假设有如下提交历史:

1
C1--C2--C3--C4

要修改C4可以使用git commit --amend;要修改C2、C3或C4可以使用git rebase -i HEAD~n;但是如果要修改C1呢?这就需要rebase --onto出场了。下面就来实例讲解如何使用rebase --onto命令。

因为要修改C1这个commit,所以先在它之上创建临时分支tb:

1
git checkout -b tb C1

然后就可以在tb分支上做想要的修改,改完之后用下面的命令提交更改的内容:

1
git commit -a --amend

这时查看tb分支的提交历史,可以发现SHA1值已经发生了变化(master分支的SHA1值仍然不变):

1
C1'

接着可以把修改后的内容和master分支合并:

1
git rebase --onto tb C1 master

表示把master分支上从C1之后的所有commit重新apply到tb分支最新的commit之后。

这里有两点要注意:一个是C1处的开闭问题,rebase --onto的机制是左开右闭,也就是说上述命令只会apply三个提交C2、C3和C4;第二个是rebase --onto之后tb分支的提交历史没有改变,还是只有一个提交C1’,当前分支也切换到了master,并且所有commit的SHA1值都发生了改变。

1
C1'--C2'--C3'--C4'

最后就是正常的rebase --continue流程了。

Comments