Git旧提交Bug修复及后续提交适配的最佳实践咨询
Git分支操作问题解答
背景
我维护一个公开代码仓库,采用从master分支拉取新分支开发功能后合并回master的工作流。当前分支结构如下:
(bugfix) | U / (master) / | A--B--C--D--E...J--K | (production)
生产环境当前指向提交B,其中存在一个Bug,已在bugfix分支的提交U中完成修复。现咨询以下问题:
1. 将该Bug修复应用到生产环境的Git推荐最佳方式是什么?
用git cherry-pick单独提取修复提交U到生产分支,完全避开master的后续提交:
- 切换到生产环境分支:
git checkout production - 挑取修复提交U:
git cherry-pick <U的提交哈希值> - 推送到远程仓库:
git push origin production
这种方式只会把Bug修复同步到生产环境,不会引入C到K的任何代码,完全符合你不想提前部署K的需求。
2. 是否可将Bug修复U应用到后续提交C、D、E等?若可以,推荐方式是什么?
可以实现,推荐用交互式变基把U的修复插入到C之前,让后续所有提交都基于修复后的代码:
- 创建临时分支避免直接修改公开的
master:git checkout -b temp-master master - 启动交互式变基,指定从提交B之后开始处理:
git rebase -i B - 在弹出的编辑器中,把
pick <U的提交哈希值>插入到C提交的上方,保存并退出 - 若遇到冲突,解决冲突后执行
git rebase --continue,直到变基完成 - 确认没问题后,将
master分支指向临时分支:git checkout master && git reset --hard temp-master - 推送到远程仓库(因修改了公开分支历史,需提前和团队沟通):
git push origin master --force-with-lease
最终会得到你想要的分支结构:
(master) | A---B---C'---D'---E' ... J'---K' | (production)
3. 是否可让提交C基于U?若可以,如何将修复应用到C、D、E等提交?
可以实现,本质是把C到K的所有提交从B的基础上,重新基于U进行变基:
- 确保本地
bugfix分支的U提交是最新的:git checkout bugfix && git pull - 创建临时分支并合并U的修复:
git checkout -b temp-rebase B && git merge bugfix - 执行变基,把
master中B之后的所有提交(C到K)迁移到临时分支上:git rebase --onto temp-rebase B master - 变基完成后,更新
master分支:git checkout master && git reset --hard temp-rebase - 推送到远程仓库(同样需提前和团队沟通,强制推送):
git push origin master --force-with-lease
最终分支结构如下:
(bugfix) (master) | | A---B---U---C'---D'---E' ... J'---K' | (production)
补充说明
- 不希望将U合并到
master,原因是暂不希望将K部署到生产环境; - 生产环境将逐步从C、D、E…升级到K,而非直接切换到K。
内容的提问来源于stack exchange,提问作者Dilep Dev
相关产品推荐
相关产品推荐

