# 如何使用 Pre-Push
# 应用场景
代码评审特性增加Pre-Push(提交前评审)模式,即用户在分支上推送代码时自动被拦截并生成代码评审单,在评审通过后代码才能推送成功,使得采用主干开发模式或希望代码评审前移的团队更便捷地展开代码评审活动,保障分支的代码质量。
# 注意事项
在保护分支上,支持通过分支规则组设置中的开关开启 Pre-Push 模式,或在推送代码时传参 mr.pre_push 创建一个 Pre-Push 模式评审单
在非保护分支上,支持在推送代码时传参 mr.pre_push 创建一个 Pre-Push 模式评审单
# 使用说明
注意:该功能仅适用于客户端推送代码,push 时具备 Developer 及以上权限即可
# 1、开启 Pre-Push
选择项目,进入项目设置 - 分支规则 (含保护分支)选择一个分支规则组,点击编辑规则组,然后勾选推送启用 Pre-Push 模式,最后点击页面下方的保存变更。

# 2、进行推送
方式 1、对于分支规则组设置中的开关已开启 Pre-Push 的保护分支:
打开 git 客户端,将本地已完成代码往对应远端保护分支(例:test-pre-push)进行推送,可以看到创建了一个 new reference

方式 2、对于分支规则组设置中的开关未开启 Pre-Push 的保护分支,或对于非保护分支,需要使用命令行参数创建 Pre-Push 评审单:
打开 git 客户端,携带 mr.pre_push 参数,将本地已完成代码往对应远端分支(例:test-pre-push-option)进行推送,可创建一个 Pre-Push 模式的评审单
git push origin test-pre-push-option -o mr.pre_push
# 或者
git push origin HEAD:refs/for/test-pre-push-option

# 3、查看评审
可进入 web 端项目合并请求列表页面,查看推送时自动生成的评审单,Pre-Push 产生的评审单前面有蓝色的图标
Pre-Push 类型评审单命名规则:取最近一个不含 Conflicts 且非 Merge 点的 commit 的首行作为标题

在客户端 push 成功后,也可以查看到对应生成的评审单

# 4、更新提交
当前用户在生成的评审未完成前,无法进行新的推送
如本地有变化,需更新之前提交,推送时需携带自定义参数 mr.id(评审单 url 最后的数字)
例:推送时生成的评审单 url 为 https://git.tencent.com/user01/prepush/merge_requests/2
则更新推送的命令为:
git push origin test-pre-push -o mr.pre_push -o mr.id=2
# 或者
git push origin HEAD:refs/for/test-pre-push -o mr.id=2

# 5、进行合并
在评审通过完成后,可在 web 端页面进行合并操作,Pre-Push 的一次操作就算完结

# 6、git 隐藏分支与 webhook 使用
工蜂 Pre-Push 支持与流水线进行适配
可在项目的高级设置 - 网络回调钩子(WebHook)设置中对 Push 事件进行配置
WebHook 返回的信息里可携带 Pre-Push 的源分支 (临时分支) 信息
Pre-Push 产生的隐藏分支名都以 refs/for 开头
具体格式为:refs/for/{user_name}/{target_branch_name}/{mr_iid}-HEAD

# 7、下载隐藏分支
隐藏分支只能 fetch 并临时存放在FETCH_HEAD,不能直接在本地生成新分支,下载方式如下
git fetch origin refs/for/zhangsan/master/3-HEAD
FETCH_HEAD相当于一个 commit sha1,一般用法如下:
# 用法一:为FETCH_HEAD创建一个分支
git branch {branch_name} FETCH_HEAD
# 用法二:切换到FETCH_HEAD(会进入无分支状态)
git checkout FETCH_HEAD
# 用法三:将当前分支的版本改为FETCH_HEAD(当前分支名不变,只是移动HEAD)
git reset --hard FETCH_HEAD
# 具体场景
# 以 merge 的方式解决冲突
参照以下步骤可获取隐藏分支代码,并进行合并推送,可用于解决冲突
步骤 1.获取并检出此合并请求的分支
git fetch origin
git fetch origin refs/for/zhangsan/master/3-HEAD
步骤 2.在本地查看更改
步骤 3.合并分支并修复冲突
git checkout master
git merge --no-ff FETCH_HEAD
步骤 4.将合并结果推送 Git 服务器
git push origin HEAD:master -o mr.pre_push -o mr.id=3
# 针对不同需求的并行开发
当同个用户需要并行开发多个直接没有关联关系的需求,并且需要分开评审时,以 master 分支为例,可参考以下步骤生成新的 MR
步骤 1.更新本地代码,并与远端对齐
git pull origin master
git reset --hard origin/master
步骤 2.在本地修改代码,产生 commit
步骤 3.使用mr.create参数推送本地代码到 Git 服务器,并产生新 MR
git push origin HEAD:master -o mr.pre_push -o mr.create