Git Subtree首次推送携带主仓库提交历史问题咨询
关于Git Subtree首次推送历史混入的问题解答
1. 首次推送时上游C获取A全部提交历史是否正常?
这确实是正常行为。原因在于Git Subtree的底层机制:首次推送子目录到上游仓库时,即使加上--squash参数,Git需要在本地仓库A和上游C之间建立子树关联,会把所有涉及子目录B的提交历史(包括A仓库中其他提交里关联B的部分)打包推送。后续推送时,因为关联已经建立,Git只会推送B目录的增量变更,所以不会再带入A的完整历史。
2. 如何避免上游C混入A的无关提交历史?
可以通过以下几种方式解决:
- 用
git subtree split拆分独立历史后推送:
每次推送前,先把B目录的提交从A的历史中拆分出来,生成一个独立的分支:
然后将这个独立分支推送到C:git subtree split --prefix=B -b temp-branch
这样C仓库只会收到和B目录相关的纯净提交历史,完全不会混入A的无关内容。git push C temp-branch:main - 初始配置时就保持历史干净:
如果是刚配置子树,添加上游C时直接用--squash导入最新快照,而不是完整历史:
后续推送都用上面的git remote add C <C的仓库地址> git subtree add --prefix=B C main --squashsplit方法,从根源避免历史混入。 - 清理已有脏历史(谨慎操作):
如果C已经混入了A的历史,且C是你的个人仓库、没有其他协作者,可以先重置C到混入历史前的状态,再重新推送split后的干净分支:# 本地切换到C对应的分支,重置到干净的历史节点 git checkout <C的本地分支> git reset --hard <混入历史前的C仓库提交ID> # 强制推送到C(注意:会覆盖C的远程历史,确保没人在C上工作) git push C main --force
3. 请求D的维护者用squash合并PR是否可行?
完全可行!当你向D提交PR时,维护者选择squash合并的话,会将C上的所有提交合并为一个全新的提交,只保留最终的代码变更,不会带入A的无关历史。不过更推荐先把C的历史处理干净(用上面的split方法),这样PR的提交记录更清晰,维护者审核起来也更轻松。
内容的提问来源于stack exchange,提问作者berkus
相关产品推荐
相关产品推荐

