效率云

    用rebase得到线性历史

    本地工作

    一个任务用一个分支,可以提交多次。

    git checkout -b 1-add-a-py
    vi a.py
    git add a.py
    git commit -m'add a.py'
    vi a.py
    git add a.py
    git commit -m'print hello world'

    push到服务器

    git push origin HEAD:refs/for/master   //评审系统中生成一条评审记录,评审的代码就是当前工作中的分支(HEAD)。本地分支1-add-a-py => 远端评审系统 => 远端master

    第一个任务还在评审时,开始做第二个任务

    git fetch
    git checkout -b 2-add-b-py origin/master
    vi b.py
    git add b.py
    git commit -m'add b.py'
    git gpush origin master

    看一下2个任务(分支),1-add-a-py产生了2个commits,2-add-b-py产生了1个commit

    $ git lola
    * ad11f1b - (HEAD -> 2-add-b-py) add b.py
    * | * 6a14db7 - (1-add-a-py) say hello
    * | * 6e8d6e2 - add a.py
    * |/
    * * 98cb99d - (origin/master, master)

    我们可以反复的在1-add-a-py和2-add-b-py这2个分支上git commit和gpush,更新代码,直到达到提交准入的要求。

    这个过程中,如果有人更新了远端的master,可能会跟我们的修改冲突。解决办法是在本地仓库先合并一次。

    git checkout 1-add-a-py
    git pull origin master
    ... 修改有冲突的文件 ...
    git commit
    git push origin HEAD:refs/for/master

    提交远端master

    最后,在网页上提交我们的2个任务

    在评审网页上找到标题为add b.py和add b.py的这个2评审,点【合入】

    提交是在远端服务器发生的,我们把更新pull回来看看

    $ git checkout master
    $ git pull
    $ git lola
    *   a5080bc - (HEAD -> master, origin/master) Merge changes from topic '1-add-a-py'
    * |\
    * | * 6a14db7 - (1-add-a-py) say hello
    * | * 6e8d6e2 - add a.py
    * * | ad11f1b - (2-add-b-py) add b.py
    * |/
    * * 98cb99d
    * $ git branch -d 1-add-a-py 2-add-b-py #分支合入master时候就可以删掉了,下次有需要再新建

    master已经更新了。百度效率云-DevOps自动合并了2个任务的分支。

    保持线性历史(可选)

    上面是基本的提交流程,容易上手,但是master历史会比较杂乱。有2类commits混在历史里面:

    评审不通过的中间commit,如上面例子的6e8d6e2,它的质量是不合格的 Merge commit,如上面例子的a5080bc,它没有贡献任何代码,却让代码历史变成了2条支线,变复杂了 重演刚才的情景,回到我们2个任务的起点,使用下面的方法就能消除这2类不受欢迎的commits,得到一条线性历史的master。

    $ git lola
    * ad11f1b - (2-add-b-py) add b.py
    * | * 6e8d6e2 - (HEAD -> 1-add-a-py) add a.py
    * |/
    * * 98cb99d - (origin/master, master)

    用amend删除评审不通过的commit

    先提交a.py,这次的目标是去掉中间版本。关键操作是commit --amend,它把旧版commit(6e8d6e2 )给丢弃掉了。

    $ git checkout 1-add-a-py
    ... vi ...
    $ git add a.py
    $ git commit --amend --no-edit #更新前一个commit的内容,保留提交日志不变
    $ git lol 6e8d6e2
    * 0c1cd2a - (HEAD -> 1-add-a-py) add a.py
    * | * 6e8d6e2 - add a.py
    * |/
    * * 98cb99d (origin/master, master)
    
    $ git push origin HEAD:refs/for/master

    由于0c1cd2a是amend了6e8d6e2而产生的commit,提交日志不变,iCode通过识别2个commit提交日志中的Change-Id,知道他们属于一次评审的2个patch。

    因此,我们就可以在百度效率云-DevOps网页上看到1-add-a-py所有amend的历史版本,同时又把这些历史版本都排除出master的历史。

    我们可以一直amend 1-add-a-py直到满意为止,然后在网页上将它【合入】master。

    用rebase去除merge commit

    接下来再提交2-add-b-py,这次的目标是不要产生merge commit。关键操作是pull --rebase,它将2-add-b-py的修改在1-add-a-py上重演了一次,避免了merge commit。

    $ git checkout 2-add-b-py
    $ git fetch
    $ git lola
        * 0c1cd2a - (origin/master, master, 1-add-a-py) add a.py
        | * ad11f1b - (HEAD -> 2-add-b-py) add b.py
        |/
       * 98cb99d
    $ git pull origin master --rebase
    $ git lol
      * f2cbe49 - (HEAD -> 2-add-b-py) add b.py
      * 0c1cd2a - (master, 1-add-a-py) add a.py
      * 98cb99d
    $ git push origin HEAD:refs/for/master

    这样,就得到了线性的历史,2个commits,分别是1-add-a-py和2-add-by-py的修改;同时每一个commit都是一个逻辑完整的小功能。

    上一篇
    功能扩展【高级】
    下一篇
    安装hook