如何merge/rebase存放在文件夹内的独立Git仓库分支
问题根因
你当前的操作属于在自有Git仓库的工作目录中嵌套克隆了另一个完全独立的Git仓库:外层仓库不会读取内层仓库的Git提交记录,只会将内层仓库的整个文件夹识别为带.git标记的特殊目录/未追踪内容,两个仓库的提交树没有任何共同祖先,因此会出现「必须进入内层文件夹才能看到独立提交历史」「GitHub提示分支提交历史完全不同无法创建PR」的问题。
解决方案
根据你是否需要保留被克隆仓库的原始提交历史,选对应方案操作即可:
方案1:保留被克隆仓库的完整提交历史,合并到自有分支
- 切到自有仓库的
branch A分支,进入之前克隆得到的内层仓库文件夹,把里面的.git隐藏目录临时移动到其他位置备份(不要直接删除,避免历史丢失) - 回到自有仓库根目录,执行
git add .将内层仓库的所有文件加入暂存区,提交一次临时版本:git commit -m "temp: import external repo files" - 给自有仓库添加被克隆仓库的远程源:
git remote add imported-repo <你之前克隆内层仓库使用的Git地址> - 拉取被克隆仓库的所有提交数据到本地:
git fetch imported-repo - 执行合并命令,允许合并无共同祖先的独立提交树:
git merge imported-repo/<需要合并的内层仓库分支名> --allow-unrelated-histories - 按提示解决合并过程中出现的文件冲突,完成后提交合并结果
- 合并完成后,你在自有仓库根目录就能查到被克隆仓库的所有原始提交记录,两个仓库的历史会串到同一条提交线上,将
branch A推送到GitHub后即可正常创建指向main分支的PR。
方案2:不需要保留被克隆仓库的提交历史,仅合并当前文件内容
这个方案操作更简单:
- 进入之前克隆得到的内层仓库文件夹,直接删除里面的
.git隐藏目录 - 回到自有仓库根目录,如果之前误将内层文件夹提交为Git子模块,先执行
git rm --cached <内层文件夹名称>清除子模块缓存标记 - 执行
git add .将内层仓库的所有文件加入暂存区,正常提交即可 - 将
branch A推送到GitHub后,所有文件会作为当前分支的普通提交存在,可直接和main分支对比创建PR,不会再触发历史不相关的报错。
内容的提问来源于stack exchange,提问作者Danyil Derkach
相关产品推荐
相关产品推荐

