所有文档

          效率云

          评审协作

          当我们对代码质量有较高要求的情况下,再使用git push直接将代码推入远程仓库的方法就难以满足我们的需求了。为此iCode为大家提供了人工评审和预提交测试的功能,下面介绍下开启方法和效果。

          开启方法

          进入代码库“提交规则”设置页,勾选“提交准入检查”。push 代码的时候需要以 refs/for/分支 的形式使用准入检查功能(详细介绍见下文)

          • 机器检查>持续集成:ipipe的change流水线执行成功才能入库
          • 人工评分>代码评审:人工评审通过,拿到+2分后才能入库
          • 人工评分>禁止自评:人工评审通过,拿到+2分后才能入库,且代码的提交人不能评审自己的代码。

          image.png

          开启上述规则的情况下,再使用git push [目标仓库] [目标分支]就不好使了。那么我们怎么提交代码呢?下面就来介绍下原理和操作方法

          原理

          每一个本地commit被合入远端任意分支(例如:master)前都需要经过评审

          本地commit先被推送到远端master的暂存区进行逐行评审

          评审通过后自动合入远端master

          评审驳回后发起人替换新版commit并丢弃旧版(git commit –amend),再次发起评审

          操作步骤

          review.png

          过程解释

          以开发master分支为例,假设我们要基于最新的master分支继续开发代码。首先进入本地的workspace,执行下述命令,

          ➜  icode git:(master) git checkout master
          Already on 'master'
          Your branch is up-to-date with 'origin/master'.
          ➜  icode git:(master) git fetch
          ➜  icode git:(master) git merge origin/master
          Already up-to-date.

          1.png

          步骤 命令
          ① 远程仓库的master分支最新一次提交是C1,基于C1拉取本地分支featureX【可选】拉本地分支featureX是可选操作,当同时需要开发多个不同的功能时拉不同的本地分支更有意义。否则直接用本地的master分支即可
          ②在本地修改代码,提交到本地仓库C2 修改代码git add <文件名>git commit -m “some comments for C2”
          ③发起Change Request(push),实时触发编码规范检查和预提交流水线构建任务,可以在此时通知其他同事来评审代码 git push origin featureX:refs/for/master
          ④所有检查通过的情况下,点击”合入“按钮成功,代码真正提交到远程仓库的master分支
          合入成功后,持续集成任务会被触发,可以在这个环节做更多的自动化验证和手工测试
          image.png image.png
          当任意一项检查不通过需要修改代码的情况下(编译失败/人工平时不通过/合入冲突……),重新回到开发环境使用相同的提交步骤。修改代码>add>commit提交为C3>push到master 修改代码

          git add <文件名>

          git commit -m “some comments for C3”

          git push origin featureX:refs/for/master

          举例

          本地开发和提交

          我要向appdemo/icode的master分支提交代码,我在本地拉出feature-abc分支作为开发分支

          ➜ $ (master) git checkout -b feature-abc
          Switched to a new branch 'feature-abc'
          ➜ $ (feature-abc) echo cat >pets
          ➜ $ (feature-abc) ✗ git add pets
          ➜ $ (feature-abc) ✗ git commit -m'get some pets'
          [feature-abc c00fc83] get some pets
           1 file changed, 1 insertion(+)
           create mode 100644 pets
          ➜ $ (feature-abc) git push origin feature-abc:refs/for/master
          Enumerating objects: 5, done.
          Counting objects: 100% (5/5), done.
          Delta compression using up to 4 threads.
          Compressing objects: 100% (2/2), done.
          Writing objects: 100% (3/3), 365 bytes | 365.00 KiB/s, done.
          Total 3 (delta 0), reused 0 (delta 0)
          remote: 
          remote: Processing changes: new: 1, refs: 1, done
          remote: 
          remote: New Changes:
          remote:   http://xly.bce.baidu.com/review/changes/170 get some pets
          remote: 
          To https://xly.bce.baidu.com/git/xxxx/Baidu/demo
           * [new branch]      feature-abc -> refs/for/master

          2-150x14.png

          (警告) 上述以master分支为例,以此类推,向其他分支提交代码的方法是一样的,在git push origin HEAD:refs/for/<目标分支>时,目标分支不同,决定了代码最终会被合并到哪个远程分支上。

          Owner评审:通过或驳回

          代码评审入口

          image.png 评审详情页

          image.png

          查看上传的commit详情、代码diff,代码逐行评审,添加评论

          • +2:通过,可以提交
          • +1:我觉得OK,还需要其他人+2
          • 0:无意见
          • -1:最好不要提交
          • -2:不能提交

          合入master

          点“评审详情页”右上角的“合入”按钮

          10.png

          【Optional】替换评审中的commit

          注意:飘红的为关键命令

          ➜  $ (feature-abc) echo cat >>pets
          ➜  $ (feature-abc) ✗ git commit --amend 
              [feature-abc 2307014] get some pets
               Date: Thu Jan 17 18:47:13 2019 +0800
               2 files changed, 2 insertions(+), 1 deletion(-)
               create mode 100644 test1.txt
          ➜ $ (feature-abc) git push origin feature-abc:refs/for/master
              Enumerating objects: 6, done.
              Counting objects: 100% (6/6), done.
              Delta compression using up to 4 threads.
              Compressing objects: 100% (2/2), done.
              Writing objects: 100% (4/4), 412 bytes | 412.00 KiB/s, done.
              Total 4 (delta 0), reused 0 (delta 0)
              remote: 
              remote: Processing changes: updated: 1, refs: 1, done
              remote: 
              remote: Updated Changes:
              remote:   http://xly.bce.baidu.com/review/changes/170 get some pets
              remote: 
              To https://xly.bce.baidu.com/git/xxxx/Baidu/demo
           * [new branch]      feature-abc -> refs/for/master

          6-150x20.png

          更新Patch Set

          image.png

          ##【Optional】git-rebase远端master

          当发生以下情况,你需要将远端的master的代码合并到本地分支,

          1. 远端master提交了一个commit,你的本地分支依赖这个commit的代码
          2. 远程master提交了一个commit,与你的本地分支合并冲突,你需要手动解决冲突 这两种场景都使用git-rebase来解决,

          命令

          ➜  $ (feature-abc) git fetch origin master:master
          From https://xly.bce.baidu.com/git/xxxx/Baidu/demo
             2897d6d..e047cf5  master     -> origin/master

          8-150x18.png

          ➜  $ (feature-abc) git rebase origin/master
          First, rewinding head to replay your work on top of it...
          Applying: get some pets
          Using index info to reconstruct a base tree...
          Falling back to patching base and 3-way merge...
          Auto-merging pets
          CONFLICT (add/add): Merge conflict in pets
          error: Failed to merge in the changes.
          Patch failed at 0001 get some pets
          The copy of the patch that failed is found in: .git/rebase-apply/patch
          When you have resolved this problem, run "git rebase --continue".
          If you prefer to skip this patch, run "git rebase --skip" instead.
          To check out the original branch and stop rebasing, run "git rebase --abort".
          ➜  $ (36d6b4c) ✗ git status
          rebase in progress; onto 36d6b4c
          You are currently rebasing branch 'feature-abc' on '36d6b4c'.
            (fix conflicts and then run "git rebase --continue")
            (use "git rebase --skip" to skip this patch)
            (use "git rebase --abort" to check out the original branch)
          Unmerged paths:
            (use "git reset HEAD    <file>..." to unstage)
            (use "git add <file>..." to mark resolution)
              both added:      pets
          no changes added to commit (use "git add" and/or "git commit -a")
          ➜  $ (36d6b4c) ✗ vi pets
          ➜  $ (36d6b4c) ✗ git add pets
          ➜ $ (36d6b4c) ✗ git rebase --continue
          Applying: get some pets
          ➜ $ (feature-abc) git push origin feature-abc:refs/for/master
              Enumerating objects: 6, done.
              Counting objects: 100% (6/6), done.
              Delta compression using up to 4 threads.
              Compressing objects: 100% (2/2), done.
              Writing objects: 100% (4/4), 412 bytes | 412.00 KiB/s, done.
              Total 4 (delta 0), reused 0 (delta 0)
              remote: 
              remote: Processing changes: updated: 1, refs: 1, done
              remote: 
              remote: Updated Changes:
              remote:   http://xly.bce.baidu.com/review/changes/170 get some pets
              remote: 
              To https://xly.bce.baidu.com/git/xxxx/Baidu/demo
           * [new branch]      feature-abc -&gt; refs/for/master</file></file>

          9-150x24.png

          提交规则设置

          image.png

          提交规则

          配置提交规则直接影响代码的提交方式和提交要求。

          • 分支:配置项对哪个分支生效。为空表示目前尚不支持按照分支维度配置,只能按照代码库维度配置
          • 禁止删除:禁止删除已经入库的提交代码,禁止使用git push -f修改远程仓库的提交历史
          • 提交准入检查:不能直接使用git push命令更新远程分支,必须经过评审检查环节
          • 机器检查>持续集成:强制检查持续集成任务执行成功
          • 人工评分>代码评审:强制要求人工评审通过
          • 人工评分>同行评审:强制要求代码的提交人不能给自己评审通过,必须找其他同事评审通过
          • 提交方式>自动提交:当不勾选”人工评分“的情况下,检查通过会自动”合入“代码到远程仓库的目标分支
          • 提交方式>合入策略:当别人在我执行合入前已经更新了远程仓库对应分支的代码时,系统如何将我的代码合入远程仓库

          默认评审人

          认评审人是一个便捷用户操作的功能,当我执行类似git push origin xxx:refs/for/xxx的命令发起评审时,默认评审人会在iCode的我的评审页中看到我的评审单。

          可以按照分支+文件/目录的维度来配置

          review-list.png

          上一篇
          权限管理篇
          下一篇
          分支开发请进