Git合并未删除另一仓库已删文件的技术咨询
解决Git跨独立仓库合并时未自动删除文件的问题
这个场景我之前处理过,核心问题在于:虽然两个仓库都源于同一个SVN实例,但它们是独立生成的Git仓库,没有共享Git历史链。Git合并时会依赖"共同祖先提交"来判断文件变更,因为找不到共同祖先,它没法识别rep2里删除的file1.txt和rep1里的是同一个文件,所以不会自动执行删除操作。下面给你几个可行的解决办法:
方法一:手动处理删除(快速直接)
如果只是一次性合并,手动处理最省心:
- 先执行合并但不自动提交:
git merge rep2/master --no-commit - 手动删除rep1里的
file1.txt:rm file1.txt - 将删除操作加入暂存区:
git add file1.txt - 最后提交合并结果,备注里说明清楚:
git commit -m "Merge rep2/master: Remove file1.txt which was deleted in rep2"
方法二:关联历史根源(适合长期合并)
如果以后还要和rep2频繁合并,最好让Git识别到两个仓库的历史关联:
- 分别在rep1和rep2中,找到对应同一SVN版本的Git提交(每个从SVN同步来的Git提交,备注里都会带SVN版本号,比如
git-svn-id: ...@1234 ...) - 在rep1中,用
git replace把rep2的根提交替换成rep1中对应的那个SVN提交,让两个仓库共享一段历史:# 替换前先获取rep2的根提交哈希 git fetch remote2 # 假设rep2根提交是R2_ROOT,rep1中对应SVN版本的提交是R1_SVN_COMMIT git replace R2_ROOT R1_SVN_COMMIT - 现在再执行
git merge rep2/master,Git就能正确识别file1.txt的删除操作,自动处理了
方法三:单独移植删除提交(精准操作)
如果只需要把rep2中删除file1.txt的操作拿过来,用cherry-pick更精准:
- 在rep2中找到删除
file1.txt的那个提交哈希(比如用git log --oneline | grep "delete file1"查找) - 在rep1的merge分支上执行:
git cherry-pick <删除操作的提交哈希> - 这个操作会单独把删除
file1.txt的变更应用到当前分支,之后再合并其他内容就不会有问题了
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

