Git如何将branch_D的3个提交从基于branch_B改基到branch_C
- 拉取远端所有分支的最新状态,确保本地和远端数据同步:
git fetch origin - 为当前
branch_D创建本地备份,后续操作即使出错也可以完全恢复原有数据,该步骤不会修改任何现有分支,无任何风险:git branch branch_D_backup origin/branch_D
整个操作过程不会修改、推送branch_A、branch_B、branch_C三个分支,完全不会影响这三个分支的原有内容
使用git rebase --onto可以精准迁移指定范围的提交,避免把branch_B的无关提交带入branch_C,命令格式为git rebase --onto <新基底分支> <旧父分支> <要迁移的分支>,对应你的场景执行以下命令即可:git rebase --onto origin/branch_C origin/branch_B branch_D
执行后Git会自动将branch_D上比origin/branch_B多的D1、D2、D3三个提交,挨个应用到origin/branch_C的顶端,你已经确认无冲突,全程不会出现报错。
变基完成后执行以下命令查看提交结构:git log --oneline --graph
确认当前branch_D的提交顺序为branch_C全量提交 → D1 → D2 → D3,和你预期的结构一致即可。
变基后branch_D的提交历史和远端旧版本不一致,需要用安全强制推送更新远端分支:git push origin branch_D --force-with-lease--force-with-lease比普通--force更安全,只会在你本地的旧branch_D和远端最新版本一致的情况下才会推送,避免覆盖其他人刚提交到branch_D的内容
确认所有操作符合预期后,可以删除本地备份分支:git branch -D branch_D_backup
如果操作过程中出现异常,随时可以执行git rebase --abort终止变基回到操作前状态,也可以用备份分支完全恢复branch_D:git checkout branch_D && git reset --hard branch_D_backup
内容的提问来源于stack exchange,提问作者PackSciences

