Git rebase简介

假设当前git repository的情况是这样的:

5-3

git rebase <new-base>命令可以把当前branchcommit ID移到<new-base> branch的后面。执行下面两条命令:

git checkout about
git rebase master

git repository变为:

5-4

 

可以看到,同“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保持不变。但是新生成的3commit都会有新的commit ID。这表明不仅仅是合并commit这么简单,而是git repositoryhistory完全被改写了。如下图所示:

5-5

 

另外,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处理到第2commit时,会停下来做一下“amending”:

5-6

处理完后,运行下面命令,提交commit

git add about/mary.html
git status
git commit --amend

--amend告诉git使用staged snapshot替代存在的commit而不是新创建一个commit
接下来继续rebase

git rebase --continue

如果rebase操作中间想放弃这次操作,可以使用“git rebase --abort”操作。

 

发表评论

邮箱地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.