如何将公开分支staging中的旧提交迁移至两个新分支?
公开分支提交迁移与历史调整的实现方案
具体操作步骤
1. 同步本地staging分支
先把本地的staging分支更新到远程最新状态:
git checkout staging git pull origin staging
2. 搭建feature-a分支并迁移B、C提交
- 基于提交A新建feature-a分支(可以用
git log找到A的提交哈希,或者用相对位置staging~8——从当前staging的末端I往前数8个提交就是A):
git checkout -b feature-a <A的提交哈希> # 或者用相对位置快速创建:git checkout -b feature-a staging~8
- 把提交B和C复制到feature-a分支上:
git cherry-pick <B的提交哈希> <C的提交哈希>
完成后feature-a的分支结构就变成A - B - C了。
3. 搭建feature-b分支并迁移D、E、F提交
- 同样基于提交A新建feature-b分支:
git checkout -b feature-b <A的提交哈希> # 或者用相对位置:git checkout -b feature-b staging~8
- 把提交D、E、F复制到feature-b分支上:
git cherry-pick <D的提交哈希> <E的提交哈希> <F的提交哈希>
完成后feature-b的分支结构就是A - D - E - F。
4. 调整staging分支到目标状态
因为staging是公开分支,调整历史后得强制推送,但要尽量避免覆盖别人的新提交:
- 切回staging分支:
git checkout staging
- 把staging分支重置到提交G(找G的提交哈希,或者用相对位置
staging~2——从I往前数2个就是G):
git reset --hard <G的提交哈希> # 或者用相对位置快速重置:git reset --hard staging~2
- 强制推送到远程staging分支(用
--force-with-lease比直接--force更安全,能防止误覆盖他人刚推送的提交):
git push --force-with-lease origin staging
重要提醒
- 一定要通知所有协作的开发者:因为staging的历史被改写了,其他有本地staging分支的人必须执行以下命令同步,否则会出现冲突:
git fetch origin git reset --hard origin/staging - 快速找提交哈希:可以用
git log --oneline查看所有提交的简短哈希和说明,方便快速定位A、B、C等提交的位置。
内容的提问来源于stack exchange,提问作者Timothy Fisher
相关产品推荐
相关产品推荐

