合并不相关的两个Git仓库流程
要将 Git 仓库 D:\code\a 合并到 D:\code\b 的 3rd/a 目录下并保留完整历史,推荐使用 git subtree 命令。该方法操作简单,能完整保留原仓库的所有提交记录,且合并后的文件会正确出现在目标子目录中。
注意:
b仓库中如果有未修改提交,需要先stash一下;- 要合并
a到目标仓库的3rd/a目录,不能存在,合并过程中会自动创建;
操作步骤(在 D:\code\b 中执行)
-
打开命令行终端(如 Git Bash、PowerShell 或 CMD),进入目标仓库
b:cd D:\code\b -
添加远程仓库(将
a作为远程源):git remote add repo-a D:\code\a -
拉取
a仓库的所有分支和提交(确保本地获得完整历史):git fetch repo-a -
使用
subtree add将a仓库合并到3rd/a目录:git subtree add --prefix=3rd/a repo-a master --message "Merge repo a into 3rd/a"说明:
--prefix=3rd/a:指定合并后文件存放的目录(自动创建)。repo-a:第 2 步添加的远程名称。master:a仓库中要合并的分支(若默认分支是main则改为main)。--message:自定义合并提交的说明信息。
-
(可选)清理远程引用:
git remote remove repo-a
验证结果
- 查看文件:
D:\code\b\3rd\a下应包含原a仓库的所有文件。 - 查看历史:使用
git log --follow 3rd/a/某个文件可以看到来自原仓库的完整提交记录。 - 查看合并提交:
git log --oneline --graph会显示合并后的分叉和合并点。
注意事项
- 分支名:若原仓库默认分支不是
master(例如main),请将命令中的master替换为实际分支名。 - 冲突处理:如果
b仓库中已存在3rd/a目录,git subtree会报错。请先移除或备份该目录。 - 相对路径:如果
D:\code\a是一个裸仓库或远程 URL,同样适用。本地路径可直接使用。 - Windows 路径:Git 命令中的路径使用正斜杠
/或双反斜杠\\,示例中已用D:/code/a格式(Git Bash 支持),若在 CMD/PowerShell 中使用,建议用D:\\code\\a或使用正斜杠。
备选方案(手动合并 + 重写历史)
如果 git subtree 不能满足需求(例如需要更精细控制),可以使用以下手动步骤:
cd D:\code\b
git remote add repo-a D:\code\a
git fetch repo-a
# 创建并切换到临时分支,合并时仅记录合并而不修改工作区
git checkout -b temp-merge
git merge -s ours --no-commit --allow-unrelated-histories repo-a/master
# 将 a 仓库的内容读取到 3rd/a 目录
git read-tree --prefix=3rd/a/ -u repo-a/master
# 提交合并
git commit -m "Merge repo a into 3rd/a with history"
# 切回原分支并合并临时分支
git checkout master # 或 main
git merge temp-merge
git branch -d temp-merge
git remote remove repo-a
这种方法同样保留完整历史,且更显式地控制了合并过程。

浙公网安备 33010602011771号