合并不相关的两个Git仓库流程

要将 Git 仓库 D:\code\a 合并到 D:\code\b3rd/a 目录下并保留完整历史,推荐使用 git subtree 命令。该方法操作简单,能完整保留原仓库的所有提交记录,且合并后的文件会正确出现在目标子目录中。

注意:

  1. b仓库中如果有未修改提交,需要先stash一下;
  2. 要合并a到目标仓库的3rd/a目录,不能存在,合并过程中会自动创建;

操作步骤(在 D:\code\b 中执行)

  1. 打开命令行终端(如 Git Bash、PowerShell 或 CMD),进入目标仓库 b

    cd D:\code\b
    
  2. 添加远程仓库(将 a 作为远程源):

    git remote add repo-a D:\code\a
    
  3. 拉取 a 仓库的所有分支和提交(确保本地获得完整历史):

    git fetch repo-a
    
  4. 使用 subtree adda 仓库合并到 3rd/a 目录

    git subtree add --prefix=3rd/a repo-a master --message "Merge repo a into 3rd/a"
    

    说明:

    • --prefix=3rd/a:指定合并后文件存放的目录(自动创建)。
    • repo-a:第 2 步添加的远程名称。
    • mastera 仓库中要合并的分支(若默认分支是 main 则改为 main)。
    • --message:自定义合并提交的说明信息。
  5. (可选)清理远程引用

    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

这种方法同样保留完整历史,且更显式地控制了合并过程。

posted @ 2026-05-15 17:52  乌合之众  阅读(57)  评论(0)    收藏  举报
clear