Git之不明觉厉7-大挪移rebase

我们来看看rebase这个命令,有可能这是我们使用最多的命令哦。rebase和merge命令都可以合并branch,一般来说rebase比merge好,我们来看看merge产生的commits。这次我们用sourcetree来看看log


source tree

可以发现merge产生的commits是合并的,这个合并的commit其实没有什么用处。我们看看rebase是怎么工作的吧。

理解rebase

  1. rebase字面意思当前的commit换一个基地


    rebase的情况

    当上图绿色branch调用rebase的时候,表示绿色的两个commit暂时被移除,因为他要换一个基地吗,注意紫色的叉叉。

  2. 那么新的基地在哪里呢?看看下图


    新的基地
  3. merge是什么情况呢?
    可以看到merge产生了一个没用的merge commit


    merge的情况

    可以看到,rebase的英文意思已经说明了意思,可见英文好是很重要的。

rebase可以合并commit

另一个很好用的功能是用来合并commit,我们新建一个branch,然后增加三个commit如下图


相同意义的commit

看看怎么合并

git rebase -i HEAD~3

这个命令会弹出一个编辑器,让我们编辑commit


rebase -i

命令成功以后,三个commit合并成一个了。


Paste_Image.png

rebase可以用来修改commit信息

我们知道git commit --amend -m "i change you" 可以对最近的一条commit做修改,那么以前的commit怎么办呢,我们可以用下面这个命令改动最近3条commit的信息。

git rebase -i HEAD~3

按照下图提示,使用reword命令就可以了


Paste_Image.png

保存以后还会弹出一个框,让我们修改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^
rebase -i

拆分成两个commit

最后我们修改完了,再调用

git rebase --continue

什么时候不要用rebase

rebase虽然好,但是不要滥用啊,一个黄金法则就是

never use it on public branches. 不要在公共的branch上用

  1. 改变master branch的历史。


    Paste_Image.png

    这样有没有发现自己的master和别人的都不一样(这里的不一样是指同名的commit hash值确不一样),下次你push的时候就需要merge了,多余的commit也会显示出你是一个菜鸟,因为会有同名的commit被merge到一起。嘿嘿。
    提示:完成这个例子需要在master branch上调用git rebase。

  2. git push --force
    如何遇到上面的那个情况,可以用这个命令把自己的master强行推到远程,这样你省事了,其他队友都傻了。不过如果你的branch是自己在用,并且推送到远程保存了,然后自己又清理了一下commit这样用还是可以的。总之确保你rebase的branch没人在用。

rebase的参数顺序问题

说了这么多,我们可能有点疑惑,到底rebase which branch onto which branch?我们有必要搞清楚参数含义

  1. git rebase 啥参数没有,表示把自己和upstream之间不同的commit,盖到upstream的头上。自己的commit在最上面。
  2. git rebase John/Feature,把自己盖到John/Feature上面

推荐阅读更多精彩内容

  • 学习资料pro git[https://git-scm.com/book/zh/v2]git - 简明指南[htt...
    合肥黑阅读 13,851评论 1 20
  • 这个小长假陪孩子去另外一个城市游玩,顺道与多年未见的高中同学见面叙旧。同学一家很是热情,我们大人一边闲聊,两家的孩...
    苏予阅读 106评论 0 0
  • 简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select *from table w...
    王纪山阅读 7,986评论 0 1
  • 我们村里有个哑女,哑女遇人羞涩的看一眼,害羞低头笑,她的笑很干净也很温暖。 这次回家,没见到哑女,妈妈讲了缘由。 ...
    乐微扬阅读 1,610评论 106 64