zoukankan      html  css  js  c++  java
  • Git usage rebase

    使用场景

    堪称整个git最完美的功能,辅以squash指令,打造一个最干净,最纯洁,最让人心神荡漾的纯线性git版本历史,让你的git功力迅速提升至神这个级别.

    我们利用下面未使用rebase的初始状态来说明

    假设你正在你的私有分支experiment分支上工作,解决那一个Bug或者开发完一个新feature,commit改动以后处于 C3。而此时主分支已经变化,从你的experiment拉出来的C2,提升至C4,一般说来这个时候,你会选择Merge,merge是正确的选择之 一,但是会让commit history变得非线性化,也就是说会出现图结构,对于我们diff和bisect都会变得不直观起来,这个时候使用rebase是一个更好的选择。

    rebase会把C2到C3之间所有的改动做成一个patch,存到一个tmp file,把你的experiment设置到master的C4状态,然后将patch应用到C4,产生一个新的commit C3 ,请务必注意,原先的C3将不复存在,这个是和merge的一个很大的区别,也就是C3包含的commit信息都会消失,那么在C3这个新commit中,须包含相关信息。

    无论rebase还是merge都请遵守一个commit对应一个问题/Feature的原则,don't mess it up!!

    绝对不要这么使用

    就是你已经把你在experiment上的改动commit_A Push到master上,你又心血来潮搞一次rebase,然后又push到master,我们说那你rebase以后呢,你的commit会改变,那 么commit_A就变成那commit_B,但是你的修改本身没有变,push到master以后,你的同事pull master的时候,相当于push了commit_A和commit_B下来,但是改动的本质是一样的,却很可能被系统判断为conflict,产生很 多很多匪夷所思的问题,整个版本树,也会变得非常奇怪起来,这下我们所有人都会愤怒,小倒霉蛋,够你喝一壶的那。

    所以千万记住: push那你的commit以后,就别再对这个commit做rebase!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    使用方法

    • 首先给出,使用rebase前的一个状态
    Git rebase origin.png
    


    • 使用merge以后的状态
    Git rebase merge.png
    


    • 使用了rebase以后的状态
    $git checkout experiment
    $git rebase master
    
    Git rebase done.png
    
    • 回到master,merge experiment分支的改动,产生一个fast-forward merge
    $git checkout master
    $git merge experiment
    
    Git rebase master merge.png
    

    其它

    rebase互动模式
    当你在experiment上的commit非常频密,比如17,18次(git鼓励频繁commit,这是好习惯),你rebase的时候不希望保留他们,而是把它们合并再一次,变为一个新的唯一的commit,那么下面的命令很适合你

    $git rebase --interactive master
    

    接下来你设置的编辑器会跳出来,需要你来指定需要squash到一起的commit

    pick ccd6e62 Work on back button
    squash 1c83feb Bug fixes
    squash f9d0c33 Start work on toolbar
    

    这样ccd6e62,1c83feb,f9d0c33 代表的三个commit就会合并到一起 。当我保存并关闭之后,会出现一个新的文本编辑器提示我为这些合并后的commit填写一个commit message,然后一切就绪。

    rebase的撤销
    某种情况下,你的rebase输出是Interactive rebase already started,而你确发现在做interactive rebase的时候你的action(pick,squash)指定错误啦,ok,让我们回滚rebase吧,1234,再来一次 <cr> git rebase --abort

    修改bug时的注意事项

    在bug fix时,我们需要在bugzilla填写commit id。同时,由于我们最近使用了git rebase的方法,在填写commit id时有可能出现错误。原因如下:

    在修改一个bug时,总共会有两个commit id

    1. 在私有分支上git commit后产生的commit id
    2. 在共有分支上git rebase后产生的commit id

    注意:这两个id是不一样的。应该使用第2种commit id。因为第1种commit id会变为无效的id。

  • 相关阅读:
    嵌入式Linux驱动学习之路(十九)触摸屏驱动、tslib测试
    GNU make使用变量⑤变量的引用、定义等
    Java并发——核心理论
    Java并发——volatile的原理
    Java线程与Linux内核线程的映射关系
    Reactor模式详解
    Java实现二分查找算法
    Dubbo协议与连接控制
    linux 域名
    package报错
  • 原文地址:https://www.cnblogs.com/yltleeral/p/4775692.html
Copyright © 2011-2022 走看看