我遇到了git的合并bug,导致代码丢失:
流程是从master拉出一个开发分支A开发功能,上线后,再继续从A分支拉出一个AA分支继续开发功能,由于上线需要重命名一个以日期为标志的分支,我就在AA分支的基础上创建了release/2022/04/11分支。
此时由于master提交了很多其他同事分支贡献的代码,我将master代码合并到release/2022/04/11分支,不出意外的出现了冲突(注意,冲突才会导致合并异常导致丢失代码,但是这个代码丢失是在合并后,还未处理冲突前,未动任何文件(包括暂存区的文件)就立刻丢失了),但是丢失的文件并非是冲突文件,并且搜索不到对应文件修改的记录。
下面是2张关于丢失代码的某个文件内容的合并前对比:
来自master-test分支的代码:
来自个人开发分支的代码(模拟release/2022/04/11分支)
在开发分支进行合并前(merge拼错成了mrege,忽略,本地改了)
合并后冲突代码里并没有该文件,但是该文件的内容诡异的没有从master-test分支合并过来
出现问题是在上面这个最新的Merge,代码会丢失
点击右侧的Browse Files进去查看文件目录,并且点击到被丢失代码的那个文件后,现象如下:
神奇的是,查了仓库的文件记录,发现提交记录在history中可以看到(2周前),但是文件内只显示上一个版本的内容(1个月前)
点击右上角的History后:
注意,这边这个文件的History列表里显示的记录中,并不包含我的修改,也就是说,排除了我本地修改了这个文件,导致这个文件被git认为是最新版本,进而取代master代码的可能。
原因分析
PS:该问题导致了我们历史两次丢失代码,务必引起重视
相关git原理(含合并原理)
两次代码丢失现象为:
- 分支master代码 A->B->A,另一分支feature/doSomething A->B,合并时 A->B->A,虽然A修改时间最后,但会当做无修改,合并后结果为B,导致错误(这里的A、B指的是文件的修改)
- 分支master->f1->f2->release,合并master时将release内容当成最新,master内容丢失
应对的办法是:无论是什么环境,当一个新功能(或者新版本)需要开发,就必须严格从master拉出代码,不允许从子分支拉出