如何在无关分支根提交与另一分支旧提交间建立分支关联?
问题背景
当初未使用git clone,直接下载了处于状态A的项目源码(本地目录记为C)。之后在本地编写代码,熟悉Git后将该源码目录初始化为仓库(对应状态D),经过多次提交后到达状态F,本地开发分支为branch#2。随后fork了主开发分支,并拉取到本地分支branch#1,此时主分支处于状态B。由于branch#1与branch#2无共同祖先,合并时会报错:fatal: refusing to merge unrelated histories。不推荐使用--allow-unrelated-histories参数绕过限制,更好的方式是建立两分支的关联——将D与A建立分支关系。
补充说明:此前相似问题的解决方案不适用,因为需要将分支根提交关联到另一分支的非最新提交,且需保留双方分支历史而非形成线性历史。
问题
- 该如何操作?
- 仅记得A的大致提交范围,无法确定精确提交,若选择稍有偏差会有问题吗?
解决方案
问题1的操作步骤
要让branch#2的根提交D与主分支的状态A建立关联,需通过交互式根变基实现,具体步骤如下:
- 切换到目标分支
branch#2:git checkout branch#2 - 启动从根提交开始的交互式变基:
此时会打开文本编辑器,显示git rebase --root -ibranch#2的所有提交记录,第一行就是根提交D。 - 将根提交D对应的指令从
pick修改为edit,保存并退出编辑器。 - Git会停在根提交D的修改状态,此时执行以下操作关联到状态A:
- 若未添加主仓库远程源,先添加:
git remote add upstream <主仓库的Git地址> - 拉取主仓库的所有提交历史:
git fetch upstream - 找到状态A对应的提交哈希(记为
<commit-A-hash>),重置当前HEAD到该提交:git reset --hard <commit-A-hash> - 重新应用原根提交D的修改,并保留原提交信息:
git add . git commit -C <原D提交的哈希值>
- 若未添加主仓库远程源,先添加:
- 继续完成变基流程:
完成后,git rebase --continuebranch#2的所有提交会基于状态A重新构建,与branch#1(主分支)拥有共同祖先A,后续合并将不再触发无关历史的报错。
问题2的解答
选择的提交与A有偏差时,影响取决于偏差方向:
- 若选的是A之前的提交:合并时,主分支中A到所选提交之间的变更会被引入
branch#2,可能产生额外冲突,需手动解决。 - 若选的是A之后的提交:
branch#2的根会关联到比A更新的节点,主分支中A到该节点的变更会成为branch#2的基础,可能导致你的本地修改与这些变更冲突,同样需要手动处理。
偏差越小,冲突的范围和处理难度越低。如果无法确定精确的A提交,选择最接近A的提交即可,后续在变基过程中逐步解决冲突,不会破坏分支历史的关联性,只是需要额外处理少量冲突。
内容的提问来源于stack exchange,提问作者nougako
相关产品推荐
相关产品推荐

