评审协作
当我们对代码质量有较高要求的情况下,再使用git push直接将代码推入远程仓库的方法就难以满足我们的需求了。为此iCode为大家提供了人工评审和预提交测试的功能,下面介绍下开启方法和效果。
开启方法
进入代码库“提交规则”设置页,勾选“提交准入检查”。push 代码的时候需要以 refs/for/分支 的形式使用准入检查功能(详细介绍见下文)
- 机器检查>持续集成:ipipe的change流水线执行成功才能入库
- 人工评分>代码评审:人工评审通过,拿到+2分后才能入库
- 人工评分>禁止自评:人工评审通过,拿到+2分后才能入库,且代码的提交人不能评审自己的代码。
开启上述规则的情况下,再使用git push [目标仓库] [目标分支]就不好使了。那么我们怎么提交代码呢?下面就来介绍下原理和操作方法
原理
每一个本地commit被合入远端任意分支(例如:master)前都需要经过评审
本地commit先被推送到远端master的暂存区进行逐行评审
评审通过后自动合入远端master
评审驳回后发起人替换新版commit并丢弃旧版(git commit –amend),再次发起评审
操作步骤
过程解释
以开发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.
步骤 | 命令 |
---|---|
① 远程仓库的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分支 合入成功后,持续集成任务会被触发,可以在这个环节做更多的自动化验证和手工测试 |
|
当任意一项检查不通过需要修改代码的情况下(编译失败/人工平时不通过/合入冲突……),重新回到开发环境使用相同的提交步骤。修改代码>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
(警告) 上述以master分支为例,以此类推,向其他分支提交代码的方法是一样的,在git push origin HEAD:refs/for/<目标分支>时,目标分支不同,决定了代码最终会被合并到哪个远程分支上。
Owner评审:通过或驳回
代码评审入口
评审详情页
查看上传的commit详情、代码diff,代码逐行评审,添加评论
- +2:通过,可以提交
- +1:我觉得OK,还需要其他人+2
- 0:无意见
- -1:最好不要提交
- -2:不能提交
合入master
点“评审详情页”右上角的“合入”按钮
【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
更新Patch Set
##【Optional】git-rebase远端master
当发生以下情况,你需要将远端的master的代码合并到本地分支,
- 远端master提交了一个commit,你的本地分支依赖这个commit的代码
- 远程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
➜ $ (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 -> refs/for/master</file></file>
提交规则设置
提交规则
配置提交规则直接影响代码的提交方式和提交要求。
- 分支:配置项对哪个分支生效。为空表示目前尚不支持按照分支维度配置,只能按照代码库维度配置
- 禁止删除:禁止删除已经入库的提交代码,禁止使用git push -f修改远程仓库的提交历史
- 提交准入检查:不能直接使用git push命令更新远程分支,必须经过评审检查环节
- 机器检查>持续集成:强制检查持续集成任务执行成功
- 人工评分>代码评审:强制要求人工评审通过
- 人工评分>同行评审:强制要求代码的提交人不能给自己评审通过,必须找其他同事评审通过
- 提交方式>自动提交:当不勾选”人工评分“的情况下,检查通过会自动”合入“代码到远程仓库的目标分支
- 提交方式>合入策略:当别人在我执行合入前已经更新了远程仓库对应分支的代码时,系统如何将我的代码合入远程仓库
默认评审人
认评审人是一个便捷用户操作的功能,当我执行类似git push origin xxx:refs/for/xxx的命令发起评审时,默认评审人会在iCode的我的评审页中看到我的评审单。
可以按照分支+文件/目录的维度来配置