Gitea撤销合并请求开发规范
1. 规范适用场景
本规范适用于Gitea远程仓库中,feature分支通过「合并请求(MR/PR)」经审核后合并至develop分支,后续因需求变更等原因,需彻底撤销该次合并的场景。
核心前提:develop分支为受保护分支,禁止本地直接推送、强制回滚及未经审核的直接修改,合并操作仅可通过Gitea网页端合并请求完成。
2. 核心原则
-
合规性:严格遵循受保护分支规则,不绕过审核流程、不破坏分支保护机制;
-
安全性:不使用强制回滚、强行覆盖等危险操作,避免引发团队代码冲突、历史丢失等问题。
-
可追溯性:全程保留Git提交历史,确保所有操作可审计、可回溯,不删除或覆盖原有提交记录;
3. 标准操作流程(必遵循)
3.1 新建revert分支(关键步骤)
通过Gitea网页端操作,从develop分支创建专门的撤销分支,分支命名规范为:revert-任务编号-任务说明(例:revert-T20260101001-新增用户登录功能)。
创建完成后,将该revert分支同步至本地,并切换至该分支(本地操作:git checkout 分支名)。
3.2 获取合并提交的SHA-1校验和
通过Gitea网页端查找目标合并提交,步骤如下:
-
进入对应仓库,切换至develop分支;
-
点击「提交」选项,查看develop分支的提交历史;
-
找到对应合并请求生成的合并提交(提交信息通常以「Merge pull request ...」开头);
-
复制该合并提交的SHA-1校验和(一串由字母和数字组成的字符串,例:
ca82a6dff817ec66f44342007202690a93763949)。
3.3 执行合并撤销命令
在本地revert分支下,执行以下命令撤销合并(需替换对应校验和):
bash
git revert -m 1 合并提交的SHA-1校验和
关键说明:
-
-m 1是必填参数,用于指定撤销合并至develop分支的改动,告知Git回滚至合并前的develop分支状态; -
该命令会自动生成一个新的撤销提交,不修改原有提交历史,确保可追溯。
3.4 推送revert分支至远程仓库
本地撤销操作完成后,将revert分支推送至Gitea远程仓库,命令如下:
bash
git push origin revert-任务编号-任务说明
3.5 发起新的合并请求(审核流程)
通过Gitea网页端发起新的合并请求,完成撤销操作的最终审核,步骤如下:
-
进入仓库,点击「新建合并请求」;
-
配置合并请求参数:
-
源分支:选择创建的revert分支(revert-任务编号-任务说明);
-
目标分支:选择develop分支;
-
合并请求标题规范:
v<版本号>-任务编号-任务说明(撤销合并请求)。例:v1.0.0-T20260101001-新增用户登录功能(撤销合并请求);
-
-
提交合并请求,等待团队审核,审核通过后完成合并。
4. 操作效果验证
合并完成后,需确认以下效果,确保撤销操作合规有效:
-
develop分支代码完全恢复至该次合并前的状态;
-
Git提交历史完整保留,包含原合并提交、撤销提交及新的合并请求记录;
-
未违反develop分支保护规则,所有操作均经过审核流程。
5. 禁止操作(严禁违反)
以下操作会破坏Git历史、引发代码冲突或违反分支保护规则,严禁执行:
-
使用
git reset --hard命令回滚本地develop分支后,强制推送到远程develop分支; -
直接通过网页端或本地命令修改远程develop分支的代码及提交记录;
-
删除原有合并提交后,强行推送覆盖远程develop分支;
-
不创建revert分支,直接在develop分支本地操作后尝试推送。
6. 关键注意事项
-
撤销合并仅针对「合并请求生成的合并提交」,必须使用
git revert -m 1命令,单独使用git revert会报错(因合并提交有两个父提交,Git无法识别回滚方向); -
若撤销后需重新开发该功能,需从develop分支(撤销后状态)重新创建feature分支,避免复用原有feature分支引发冲突;
-
所有操作需同步告知团队成员,确保团队代码版本一致,避免因本地分支未同步导致冲突。
7. 关键技术说明
7.1 git revert命令区别
| 命令格式 | 适用场景 | 是否需加-m 1 |
本规范适配性 |
|---|---|---|---|
git revert <普通提交的SHA-1校验和> |
撤销单条普通代码提交 | 否 | ❌ 不适用 |
git revert -m 1 <合并提交的SHA-1校验和> |
撤销合并请求生成的合并提交 | 是(必须) | ✅ 强制使用 |
7.2 合并提交特性
合并请求生成的合并提交包含两个父提交:
-
父1:develop分支合并前的最后一次提交;
-
父2:feature分支的最终提交;
-m 1 核心作用是指定Git以父1为基准,撤销合并带来的所有改动。