Git合并请求后仅单个文件代码及提交记录消失,是什么原因该如何解决?
问题原因
- 合并冲突解决错误:你和另一位开发者都修改了同一个目标文件,对方将
his_feature_branch合并到develop时触发了文件冲突,解决冲突时直接选择保留本地分支的文件版本,完全丢弃了你之前提交的改动。该操作的变更会被合并到对方的合并提交中,不会生成独立的删除提交,仅查看普通提交记录时无法找到代码丢失的痕迹。 - 合并策略误用:如果对方合并时使用了
git merge -s ours的 ours 合并策略,Git会直接忽略所有和他的分支存在冲突的改动,用他的文件内容直接覆盖目标分支,也不会留下明显的删除记录。 - 单个文件无提交记录的原因:你的改动被后续的合并提交覆盖后,Git查看单个文件历史时默认只会展示对文件最终内容有实际影响的提交,你的提交因为改动被完全覆盖,不会出现在该文件的历史列表中。
- GitLab无提交可比较的原因:你的
my_develop分支的提交已经被纳入develop的提交链路中,只是合并提交覆盖了文件内容,因此Git判定所有提交已合并,不存在新的可比对变更。
修复方案
快速恢复丢失代码
- 基于最新的
develop分支新建修复分支:
git checkout develop git pull origin develop git checkout -b fix_missing_feature
- 从你的历史功能分支中提取丢失的文件覆盖到修复分支:
# 替换下方路径为你丢失代码的文件路径 git checkout my_develop -- src/xxx/your_lost_file.js
- 验证文件内容符合预期后,提交改动并提交到
develop的合并请求,审核通过后即可恢复丢失的代码。
后续规避方案
- 仓库开启合并请求冲突强制提醒,禁止开发者直接使用
ours/theirs策略暴力解决冲突,冲突涉及其他人改动时必须同步确认后再提交。 - 合并请求增加多人审核规则,涉及公共文件改动的合并必须通知相关改动开发人员审核后再合入。
- 功能分支开发周期较长时,定期同步
develop分支的最新改动到本地功能分支,减少后续合并的冲突范围。
内容的提问来源于stack exchange,提问作者Thịnh Hà
相关产品推荐
相关产品推荐

