为什么git merge会忽略已删除文件?能否强制执行源分支的文件删除?
问题原因
-Xtheirs仅为递归合并策略的冲突解决选项,仅在出现内容冲突时优先选择main分支的内容,无冲突的文件删除操作不属于该选项的覆盖范围。
本地运行正常、GitHub Action运行异常的核心原因是:GitHub Action默认的actions/checkout为浅克隆模式,仅拉取最新1个提交,Git缺少足够的提交历史判断两个分支的分叉变更点,无法识别main分支的删除操作。
解决方案
第一步:修复CI环境的代码拉取配置
调整workflow中的checkout步骤,拉取全量提交历史,保证Git可以正常识别分支间的变更:
- uses: actions/checkout@v4 with: fetch-depth: 0
第二步:调整合并命令确保删除操作同步
如果拉取全量历史后仍存在删除不同步的问题,在原有合并命令执行后新增同步删除的步骤即可:
# 执行原有合并逻辑 git merge --no-commit -s recursive -Xtheirs main # 批量删除所有main分支已删除的文件 git diff --name-only --diff-filter=D main | xargs -r git rm # 提交合并结果 git commit -m "Merge main to release, sync all deletions"
如果你的release分支不需要保留任何独立于main的修改,完全跟随main分支更新,可以用更稳定的全量同步方案,不会出现任何变更遗漏:
# 先执行ours合并,仅保留合并提交记录,不修改文件 git merge -s ours --no-commit main # 将当前分支的文件树完全重置为和main分支一致 git read-tree -u --reset main # 提交合并结果 git commit -m "Fully sync release with latest main"
内容的提问来源于stack exchange,提问作者aormsby
相关产品推荐
相关产品推荐

