Git subtree split如何保留合并提交历史?
如何在Git子树拆分时保留合并提交历史
默认情况下git subtree split会扁平化提交历史,自动丢弃未直接修改目标目录的合并提交,甚至会把涉及目标目录的合并提交拆成线性提交。要保留合并提交历史,有两种可靠的解决方案:
1. 使用git filter-repo替代(推荐)
git filter-repo是Git官方推荐的历史重写工具,比git subtree split更灵活,原生支持保留合并提交。只需执行以下命令:
git filter-repo --path <你要拆分的目录路径> --preserve-merge-commits
这个命令会直接重写当前仓库,只保留指定目录的所有提交记录,包括合并提交的完整结构。如果想保留原仓库不变,可以先克隆一份镜像仓库再执行上述命令。
2. 手动补全git subtree split的合并提交(适合特殊场景)
如果必须使用git subtree split,可以按以下步骤补回合并提交:
- 先用
git subtree split生成初始拆分分支:git subtree split --prefix=<目标目录> -b split-branch - 用
git log --merges --grep="Merge branch" -- <目标目录>找出所有修改过目标目录的合并提交 - 逐个将这些合并提交 cherry-pick 到拆分分支:
git cherry-pick -m 1 <合并提交哈希> - 最后整理拆分分支的历史即可
需要注意的是,这种方法只适用于合并提交确实修改了目标目录的情况,如果合并提交未涉及目标目录,git subtree split丢弃它们本身也是合理的——毕竟这些提交和拆分出的子项目无关。
内容的提问来源于stack exchange,提问作者Moko Doko
相关产品推荐
相关产品推荐

