特定分支策略下Git Rebase的规范操作方法咨询
Git Rebase 操作场景:并行Feature分支合并前的Rebase方案
仓库分支策略
- 存在长期维护的
master分支 - 开发新功能时从
master分支切出feature分支,例如feature/A、feature/B - 需求、缺陷或任务分支从所属的feature分支切出
- 多个feature可并行开发
- 需求、缺陷、任务分支完成后合并至对应的feature分支
- 每个feature完成后需合并至
master分支
场景描述
feature/A与feature/B并行开发,feature/A先完成并合并至master分支。待feature/B完成后,需在提交合并至master的Pull Request前,将其Rebase到包含feature/A最新代码的master分支上。
已尝试的两种方法
方法1
- 在本地从
feature/B分支新建task/rebase分支 - 执行
git rebase master - 迭代解决冲突并完成Rebase
- 将
task/rebase分支推送到远程仓库 - 从
task/rebase向master提交Pull Request
疑问:
- 是否应从
task/rebase向feature/B提交Pull Request?但这样无法合并变更 - 若采用此方法,如何让
feature/B分支获取Rebase后的变更?
方法2
- 在本地切换到
feature/B分支 - 执行
git rebase master - 迭代解决冲突并完成Rebase
- 拉取远程
feature/B分支(因本地分支已分叉,推送前需拉取),再次解决冲突 - 将变更推送到远程仓库,从
feature/B向master提交Pull Request
疑问:
- 这是正确的Rebase方式吗?提交的Pull Request中出现重复提交
正确的Rebase操作方式
标准操作流程
- 切换到本地
master分支,拉取最新代码:git checkout master git pull origin master - 切换到
feature/B分支:git checkout feature/B - 执行Rebase操作,将
feature/B的提交基于最新master重放:git rebase master - 遇到冲突时,手动修改冲突文件,然后执行以下命令继续Rebase:
若需跳过当前提交或终止Rebase,可分别使用git add <冲突文件名> git rebase --continuegit rebase --skip或git rebase --abort - Rebase完成后,由于本地
feature/B的提交历史已被改写,需强制推送到远程仓库(使用--force-with-lease比--force更安全,可避免意外覆盖他人提交):git push origin feature/B --force-with-lease - 直接从远程
feature/B分支向master提交Pull Request即可
对两种方法的疑问解答
方法1相关疑问
- 不需要从
task/rebase向feature/B提交Pull Request。task/rebase是Rebase后的feature/B副本,提交PR会引入冗余合并记录,破坏分支历史一致性。 - 让
feature/B获取Rebase变更的正确方式:- 本地切换到
feature/B分支:git checkout feature/B - 将
feature/B指针直接指向Rebase后的提交:git reset --hard task/rebase - 强制推送到远程:
git push origin feature/B --force-with-lease - 最后可删除临时分支
task/rebase:git branch -D task/rebase
- 本地切换到
方法2相关疑问
- 方法2的第4步是错误的,这不是正确的Rebase方式。Rebase完成后本地分支历史已与远程分叉,拉取远程分支会触发合并操作,导致提交记录重复。正确做法是去掉拉取步骤,直接执行强制推送即可。
内容的提问来源于stack exchange,提问作者letsbondiway
相关产品推荐
相关产品推荐

