仓库合并操作失误后,如何正确合并FeatureBranch到Dev分支?
问题背景
我们的长期发布分支为Dev(非Master分支),另有一个包含多次提交与推送的旧分支FeatureBranch,操作中出现以下混乱:
- 误将Dev合并到FeatureBranch(提交ID:
d5de75c),解决冲突后完成操作 - 将FeatureBranch回退至错误合并前的状态
- 通过Bitbucket拉取请求将FeatureBranch合并到Dev(提交ID:
78e4c0f),无冲突但疑似撤销了Dev上的提交,推测是FeatureBranch的回退提交导致 - 已回退此次合并操作(提交ID:
ae2bf73)
当前本地FeatureBranch已重置到提交f0e83d1,Git日志如下:
* ae2bf73 (origin/Dev, Dev) Merged in undo22 (pull request #23) |\ | * d0292f4 (origin/undo22) Revert "Merge FeatureBranch to Dev (pull request #22)" |/ * 78e4c0f Merged in FeatureBranch (pull request #22) |\ | * 3c2f132 (origin/FeatureBranch) Re-adding accidentally reverted change. | * f586c2e Revert "Merge branch 'Dev' into FeatureBranch" | * e996bcc Revert "#IC-67 #IC-179 [Redacted]" | * d5de75c Merge branch 'Dev' into FeatureBranch | |\ | * | f0e83d1 (HEAD -> FeatureBranch) #IC-67 #IC-179 [Redacted]
需找到将FeatureBranch合并到Dev的最优方案,倾向于强制推送回混乱前状态再合并,但希望尽量避免强制推送;团队规模小,本地改动极少,可接受远程仓库历史变更。
方案一:允许强制推送的最优方案(推荐)
结合团队现状,这种方式最直接干净:
- 确认本地FeatureBranch已处于正确的目标提交
f0e83d1(当前已满足) - 用安全强制推送覆盖远程FeatureBranch:
git push origin FeatureBranch --force-with-lease--force-with-lease比直接--force更安全,能避免意外覆盖他人未同步的改动 - 在Bitbucket重新创建从FeatureBranch到Dev的拉取请求,正常合并即可
方案二:避免强制推送的替代方案
如果不想修改远程分支历史,可通过以下两种方式处理:
方式1:变基清理FeatureBranch
- 拉取Dev分支最新代码:
git checkout Dev git pull origin Dev - 切换到FeatureBranch,将
f0e83d1的有效改动移到Dev最新提交之后:
这条命令会丢弃FeatureBranch上从git checkout FeatureBranch git rebase --onto Dev d5de75c^ FeatureBranchd5de75c开始的所有混乱提交,只保留错误合并前的有效改动 - 解决可能出现的冲突,完成变基后推送到远程:
注:变基修改了分支历史,这里大概率仍需添加git push origin FeatureBranch--force-with-lease,但影响范围比直接强制推送更小
方式2:创建干净新分支替代
- 基于正确的提交
f0e83d1创建新分支:git checkout f0e83d1 git checkout -b FeatureBranch-Clean - 推送到远程仓库:
git push origin FeatureBranch-Clean - 用新分支创建到Dev的拉取请求,合并完成后可删除旧的FeatureBranch
内容的提问来源于stack exchange,提问作者MackTuesday
相关产品推荐
相关产品推荐

