Git Merge未显式冲突却覆盖文件,求原因及未提交时的回退方法
问题1:为啥合并没提示冲突反而直接覆盖了我的文件?
这种情况大概率是这几个原因之一,帮你拆解下:
- 你的myFeature提交已经被master包含了:要是之前你已经把myFeature的代码合并到master(比如通过PR或者本地merge),之后又切回myFeature改了东西但没提交?不对,你说git log能看到有效提交——哦,可能是你在myFeature的新提交被别人cherry-pick到master了。Git合并时会识别这些提交已经在master历史里,直接做快进合并,但如果这时候你在myFeature有未提交的工作区修改,Git会自动合并,只要master的版本和你的修改没有行级冲突,就直接覆盖了本地改动(但提交记录还在,所以log里能看到)。
- Git自动合并时优先用了master的版本:Git只会在同一行代码有不同修改时才弹冲突提示。如果你的myFeature和master改的是文件的不同区域,或者master直接把整个文件重写了,Git会自动完成合并,不会给你提示。这时候如果master的修改刚好覆盖了你在myFeature的所有改动,就会出现“成果丢失”的情况,但你的提交记录还在Git历史里,只是当前工作区是合并后的结果。
- 有没有可能搞反合并方向? 虽然你说的命令是对的,但可以跑个
git reflog看看操作历史确认下,万一手滑输错了呢?不过这个可能性不大。
问题2:没提交合并结果,怎么正确回退?
既然还没提交合并,而且之前的提交记录都在,这两种方法都能安全回退:
- 首推:
git merge --abort:这个命令就是专门用来终止未完成的合并的,执行后会把工作区、暂存区和分支状态完全恢复到合并前的样子,完全不会碰你的历史提交。 - 备选:
git reset --hard HEAD:如果git merge --abort不好使(比如合并过程中没生成MERGE_HEAD文件),可以用这个。它会强制把当前分支的HEAD指针切回合并前的提交,同时覆盖工作区和暂存区的内容——注意,这个命令会丢合并过程中所有未提交的修改,确定要回退再执行哈。
另外,可以先跑git status看看当前是不是处于合并状态(会显示类似“You have unmerged paths.”的提示),确认后再操作更稳妥。
内容的提问来源于stack exchange,提问作者PlayHardGoPro
相关产品推荐
相关产品推荐

