Eclipse EGit合并时丢弃变更的问题排查与求助
我本来打算在谷歌搜索排名第一的那个Git相关问题下回复,但想了想还是开个新问题更合适——毕竟Stack Overflow不是论坛,得保持问题的独立性。
分支状态示意图(已替换真实提交信息)

追踪所有提交记录后,我定位到问题出在同事的最后一次合并提交(图里最顶部的那次),但具体原因还是摸不着头脑——同事那次大提交和冲突文件提交之间的所有变更都凭空消失了。
图里的分支线条含义:
- 绿色线条:同事的本地分支
- 橙棕色线条:hotfix分支
- 蓝色线条:我的分支
先说说我的操作流程:
我解决了cb2ff5f提交的冲突后,合并了hotfix分支的变更,还顺便更新了对应文件的版本号。
与此同时,同事一直在开发新内容,他的工作区处于dirty state(未提交的本地修改状态)。我告诉他我已经合并了他的变更,让他拉取远程分支,但他本地的脏文件和包含我合并操作的远程分支产生了冲突,没法直接拉取。他用的是Eclipse EGit作为Git客户端,当时Eclipse弹出了三个选项:重置文件(丢弃本地变更)、暂存或提交。他选了提交,也就是3c684e1这次提交(但还有其他文件依然处于脏状态)。可之后他做的最终合并提交,居然把远程分支的所有变更都丢了——包括我之前的合并提交内容。
这难道是Eclipse EGit的Bug吗?我实在想不出其他可能性了。
更新1:诡异的日志与实际文件不符
我发现了一个有意思的现象:执行git log -p 3c684e1 12ab983和git log -p 8095107 12ab983时,日志输出显示我的提交变更已经被正确合并了,但当我执行git checkout 12ab983切换到这个提交后,那些变更却根本不存在——感觉Git像是在“撒谎”一样。
更新2:复现尝试的结果
我试着复现这个问题:
- 从提交
8095107创建本地分支branch_mine - 从同事在我解决冲突前的大提交
137be26创建branch_other - 还原同事的操作流程:修改部分文件让工作区处于脏状态,尝试合并
branch_mine时Eclipse提示冲突,提交冲突文件后再合并,这次合并成功且没有冲突,我的变更也完好保存在新的合并提交里。
所以问题肯定出在同事那边,但我还是不确定具体原因,很担心以后再遇到同样的情况。会不会是文件系统同步的问题?另外值得一提的是,他虽然用EGit作为Git客户端,但实际是在Visual Studio Code里写代码,会不会是这两个工具之间的同步出了问题,导致合并提交异常?
内容的提问来源于stack exchange,提问作者lordscales91

