假设当前git repository
的情况是这样的:
git rebase <new-base>
命令可以把当前branch
的commit ID
移到<new-base> branch
的后面。执行下面两条命令:
git checkout about
git rebase master
则git repository
变为:
可以看到,同“3-way merge
”相比(参考:Git branch简介),不用产生一个新的commit ID
。
git rebase -i <new-base>
是交互式地进行rebase
操作:可以对每个commit
进行操作。举例如下:
git rebase -i master
执行完以后,会打开一个文本编辑器,列出所有需要操作的commit
。修改如下:
pick 5cf316e Add empty page in about section
squash 964e013 Add contents to about page
pick 89db9ab Add HTML page for personal bio
squash 2bda8e5 Add empty HTML page for Mary's bio
pick 915466f Add link to about section in home page
前两个commit
会合并成一个commit
,接下来两个commit
会合并成一个commit
,最后一个commit
保持不变。但是新生成的3
个commit
都会有新的commit ID
。这表明不仅仅是合并commit
这么简单,而是git repository
的history
完全被改写了。如下图所示:
另外,git rebase -i <new-base>
还可以改写某个snapshot
。举例如下:
git rebase -i master
然后edit
中间的commit
:
pick 58dec2a Create the about page
edit 6ac8a9f Begin creating bio pages
pick 51c958c Add link to about section in home page
当git
处理到第2
个commit
时,会停下来做一下“amending
”:
处理完后,运行下面命令,提交commit
:
git add about/mary.html
git status
git commit
--amend
告诉git
使用staged snapshot
替代存在的commit
而不是新创建一个commit
。
接下来继续rebase
:
git rebase --continue
如果rebase
操作中间想放弃这次操作,可以使用“git rebase --abort
”操作。