You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将一个目录下多个独立.git仓库合并并保留提交历史?

当然可以!完整保留提交历史的合并方案

先给你提个醒:操作前一定要给每个子仓库做备份,毕竟涉及到提交历史重写,不可逆,留个副本以防万一准没错。

下面是一步步的实操流程,假设你的主目录是Project,里面有folder1、folder2这些带独立.git的子目录:

1. 创建新的主仓库

首先我们要建一个空的主仓库,用来容纳所有子仓库的内容和历史:

cd Project
mkdir main-repo
cd main-repo
git init

2. 重写子仓库的提交历史(核心步骤)

每个子仓库的文件现在都是根目录下的,直接合并会导致文件冲突,所以我们需要把每个子仓库的所有提交历史重写,让所有文件都归到对应的子目录下(比如folder1的所有文件都放到folder1/路径下)。

这里用官方推荐的git filter-repo工具(比旧的git filter-branch更安全高效),如果你的Git没有这个工具,可以用pip install git-filter-repo安装。

以folder1为例:

# 进入子仓库目录
cd ../folder1
# 重写历史,把所有文件移动到folder1子目录下
git filter-repo --to-subdirectory-filter folder1

3. 将子仓库合并到主仓库

回到主仓库,把处理好的子仓库作为远程仓库拉取进来:

cd ../main-repo
# 添加子仓库作为远程源
git remote add folder1 ../folder1
# 拉取子仓库的所有提交历史,--allow-unrelated-histories允许合并无关联的仓库
git pull folder1 main --allow-unrelated-histories

对folder2(以及其他子仓库)重复上面的步骤:

# 处理folder2
cd ../folder2
git filter-repo --to-subdirectory-filter folder2

# 合并到主仓库
cd ../main-repo
git remote add folder2 ../folder2
git pull folder2 main --allow-unrelated-histories

4. 验证与推送

合并完成后,你可以查看提交历史确认所有记录都保留了:

git log --oneline --graph

你会看到每个子仓库的提交都完整保留,而且文件都在对应的子目录下,不会互相冲突。

最后推送到你的Git平台:

# 添加远程平台仓库地址
git remote add origin <你的Git仓库URL>
# 把主分支改名为main(如果平台默认是main的话)
git branch -M main
# 推送所有内容
git push -u origin main

额外说明

  • 如果子仓库有其他分支(比如dev),你只需要切换到对应分支,重复历史重写和拉取的步骤,再合并到主仓库的对应分支即可。
  • 如果你不想修改原有的子仓库,可以先复制一份子仓库的副本,在副本上操作历史重写,这样原仓库不受影响。

内容的提问来源于stack exchange,提问作者Omer Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:14