我们来看看rebase这个命令,有可能这是我们使用最多的命令哦。rebase和merge命令都可以合并branch,一般来说rebase比merge好,我们来看看merge产生的commits。这次我们用sourcetree来看看log
可以发现merge产生的commits是合并的,这个合并的commit其实没有什么用处。我们看看rebase是怎么工作的吧。
理解rebase
-
rebase字面意思当前的commit换一个基地
当上图绿色branch调用rebase的时候,表示绿色的两个commit暂时被移除,因为他要换一个基地吗,注意紫色的叉叉。
-
那么新的基地在哪里呢?看看下图
-
merge是什么情况呢?
可以看到merge产生了一个没用的merge commit
可以看到,rebase的英文意思已经说明了意思,可见英文好是很重要的。
rebase可以合并commit
另一个很好用的功能是用来合并commit,我们新建一个branch,然后增加三个commit如下图
看看怎么合并
git rebase -i HEAD~3
这个命令会弹出一个编辑器,让我们编辑commit
命令成功以后,三个commit合并成一个了。
rebase可以用来修改commit信息
我们知道git commit --amend -m "i change you" 可以对最近的一条commit做修改,那么以前的commit怎么办呢,我们可以用下面这个命令改动最近3条commit的信息。
git rebase -i HEAD~3
按照下图提示,使用reword命令就可以了
保存以后还会弹出一个框,让我们修改message,保存就可以了。
rebase 可以用来拆分commit
有的时候,我们经常很懒一下次提交很多内容,然后有后悔,毕竟提交的信息别人能看到,不讲究不行啊。如果我们想拆分一个大的commit到小的几个commit,怎么做呢。
先初始化一下文件吧
echo "split file 1" > split.txt
echo "split file 2" > split2.txt
git add -A
git ci -am "one commit"
现在我们要把最近的一个commit拆成两个,分别提交。
git rebase -i HEAD^
最后我们修改完了,再调用
git rebase --continue
什么时候不要用rebase
rebase虽然好,但是不要滥用啊,一个黄金法则就是
never use it on public branches. 不要在公共的branch上用
-
改变master branch的历史。
这样有没有发现自己的master和别人的都不一样(这里的不一样是指同名的commit hash值确不一样),下次你push的时候就需要merge了,多余的commit也会显示出你是一个菜鸟,因为会有同名的commit被merge到一起。嘿嘿。
提示:完成这个例子需要在master branch上调用git rebase。 - git push --force
如何遇到上面的那个情况,可以用这个命令把自己的master强行推到远程,这样你省事了,其他队友都傻了。不过如果你的branch是自己在用,并且推送到远程保存了,然后自己又清理了一下commit这样用还是可以的。总之确保你rebase的branch没人在用。
rebase的参数顺序问题
说了这么多,我们可能有点疑惑,到底rebase which branch onto which branch?我们有必要搞清楚参数含义
-
git rebase
啥参数没有,表示把自己和upstream之间不同的commit,盖到upstream的头上。自己的commit在最上面。 -
git rebase John/Feature
,把自己盖到John/Feature上面