Rebase code

2020-03-17  本文已影响0人  醉看红尘这场梦

实际上,为了合并不同分支的代码,git merge并不是唯一的方法。git rebase同样可以达到合并的目的。那么,这两个命令的差别是什么呢?用文字描述可能会比较复杂,我们直接来看例子。

合并分支的过程

为了演示这个过程,我们新建一个空目录merge-code,然后依次完成下面的动作:

git add .
git commit -m "Add a@master.txt"

这时,执行git log就会看到这样的结果:

image

或者,我们也可以执行git log --oneline查看提交信息摘要:

image
git checkout master
touch b@master.txt
git add .
git commit -m "Add b@master.txt"

git checkout feature
touch d@feature.txt
git add .
git commit -m "Add d@feature.txt"

git checkout feature
touch e@feature.txt
git add .
git commit -m "Add e@feature.txt"

image image image

其中,红色的线条表示master分支,绿色的线条表示feature分支。分支上的*表示我们完成的动作。这样我们上面的整个过程就看的很清楚了。

但有时,我们创建分支仅仅是为了不影响master,并没有必要在master的提交记录上看到这个创建分支的过程,因为分支的创建有可能会很频繁。这时,我们就可以使用git rebase命令。

通过rebase简化提交记录

为了了解rebase的用法,在master分支,我们先执行git reset --hard 12beaa3恢复到创建b@master.txt。然后,切换到feature分支。此时,master分支上有a@master.txt和b@master.txt,而feature分支上有d@feature.txt和e@feature.txt。

接下来,为了把feature分支上的提交记录合并到master,让这些行为看上去就像是在master分支上发生的,我们可以先在feature分支执行git rebase master,就会看到这样的结果:

image

图中,replay your work on top of it中的it,指的就是rebase后面的master。git会把我们在当前分支上的操作,“重放”到master当前的最新一次提交之后。对于我们的例子来说,也就是创建了b@master.txt之后。

现在,回到master分支,当我们再把feature合并进来之后,执行git log --oneline --graph,就会看到master上的提交日志就变成了这样:

image

也就是说,我们在这两个分支上进行的操作,从提交日志上已经看不出来了。master上的提交记录完全变成了一个序列化执行的日志。

上一篇 下一篇

猜你喜欢

热点阅读