分支逆向提交,导致冲突不可见

先说现象:同事在Develop分支上删除了一些文件,我们将自己的特性分支合并到Develop时,不会感知到这些删除操作,所以没有报冲突,而是当做新文件给直接提交了。我们的特性分支是从Uat分支签出来的,按道理说这种现象应该不存在。

具体分析的时候,发现如下情况:

  1. A同事将删除了文件的分支合并到了Develop分支,解决了冲突,并提交了代码。
  2. B同事将自己的特性分支合并到了Uat,解决了冲突,并提交代码,进行发布进行功能验证
  3. B同事将自己在Uat已经验证的分支合并到了Develoop、Sit分支,这个时候没有保任何冲突,同事直接提交
  4. C同事(也就是我)拉Develop最新的分支,合并自己的特性分支,这个时候没有报任何冲突,同事直接提交

事情发生的根源在于B同事将Uat分支合并到Develop时的操作,但是此时,Git也并没有报任何冲突。我目前猜想的原因时,Uat分支已经和Develop分支失去了同步,也就是Develop分支和Uat分支只是某个父节点有关系,而两个分支的Head之间没有任何关系,所以Uat合并到Develop时,被视为了一次极其普通的合并。

额,其实我们项目分支管理挺乱的,我们虽然有规范,但是没有专门的人负责这块,约束这些东西,所以大家都是按照自己的理解在处理问题。

简单实验设计

  1. master分支:a.txt
  2. child1 from master分支:delete a.txt
  3. child2 from master分支:change a.txt
  4. 合并child1分支到master
  5. 合并child2分支到master

合并时报冲突,提示a.txt被删除,所以,如果操作正确,Git肯定是会发现删除冲突的。

解决问题时的思路

  1. 需要先确保是不是因为Git没有删除冲突的提示,导致我在合并代码时直接合并了。用了上面的小实验,发现Git会进行提示。

  2. 需要知道是不是删除操作有什么问题,导致跟踪丢失。我用了下面的指令进行查看,发现只要是删除的文件,都查不出来,所以从这个角度解决问题,没有太大的意义。


git ls-tree -r master --name-only

  1. 对比是否是因为Git命令行没有提示,而Idea的仓库管理工具会提示(同事认为是这样的),经过实验,发现两者的表现是一样的。

  2. 用git checkout COMMIT_ID直接到某次提交,然后用git merge COMMIT_ID,去复现开发时的操作,看没有提示。(这种操作拓展了我解决问题的思路,也正是这个操作让我发现了问题所在)

参考资料

  1. 如何让git显示正在跟踪的文件列表?