Git 为什么合并后没有跟踪而丢失更改?

Git 为什么合并后没有跟踪而丢失更改?,git,gitlab,git-merge,Git,Gitlab,Git Merge,在编写代码时,我们遇到了一个问题: 8月15日,类“UserHelper”中的方法“CheckforLogout”仍然存在(提交:08cc360或图片中的绿色提交)。8月26日之后,这种方法完全消失了 我检查了是否有删除方法的提交,但没有 在阅读了一篇类似的文章之后,我开始将提交内容一分为二,结果是commit 9013cf5(图中的黄色commit)是“坏的” 造成这种行为的可能原因是,我的老板进行了更改,并将其提交到存储库,而没有先拉。由于他的答复已相当过时,因此当时需要合并。由于这次合并,

在编写代码时,我们遇到了一个问题:
8月15日,类“UserHelper”中的方法“CheckforLogout”仍然存在(提交:08cc360或图片中的绿色提交)。8月26日之后,这种方法完全消失了

我检查了是否有删除方法的提交,但没有

在阅读了一篇类似的文章之后,我开始将提交内容一分为二,结果是commit 9013cf5(图中的黄色commit)是“坏的”

造成这种行为的可能原因是,我的老板进行了更改,并将其提交到存储库,而没有先拉。由于他的答复已相当过时,因此当时需要合并。由于这次合并,我的方法被删除

因此,“错误提交”已经过时,没有我的方法

对我来说,重要的问题是:

  • 为什么没有再次删除的方法条目
  • 我可以从软件方面防止这种行为吗
我们目前正在使用GitLab 12.6.4-ee作为git服务器


谢谢您的考虑

您所展示的图片可能没有提供足够的上下文来明确发生了什么;但我们可以从这一点开始:黄色提交(标记为“对分坏”)与“绿色”提交及其后的所有内容位于不同的分支[1],并且其父级未显示在图片中(它位于屏幕底部)。结合你的解释,我们可以做出一些有根据的猜测:

很可能我们看到的是

... O -- x -- G -- x -- P1 -- M -- ... <--(HEAD)
     \                       /
      Y -- x -- x -- x -- P2 
(此合并将在“分离头”状态下进行,是一次性合并,只是为了重新创建发生的情况。之后,您可能希望中止合并并签回您的工作分支。)

如果确实存在影响您的功能的冲突,那么最有可能的解释是它被错误地解决了。如果是这样的话,这不是git可以解决的问题——手动解决冲突的关键在于工具无法自动决定什么是正确的。有时,你无法让工具保护你免受犯错的人的伤害

(解决合并冲突是一项技能。通常不难看出您应该做什么,但例如,如果另一个分支实际上正在从代码的同一区域删除代码,那么冲突标记可能看起来您的代码只是被删除的块的一部分。)

请注意,任何与您的更改相冲突的更改都不一定在
G
;它将介于
O
P2
之间

如果在重做合并时没有冲突,那么下一步就是查看合并版本是否仍然包含代码;如果没有冲突,那么应该是这样。如果没有,那么就需要更多的信息来弄清楚到底发生了什么——不幸的是,除了实际检查回购协议(我相信这一点有点过于专有)之外,我不知道该问什么

如果重做合并确实包含您的代码,那么出于某种原因,原始合并是以不同的方式进行的,并且只有执行合并的人才能解释这一点



[1] 在本例中,我使用了提交拓扑意义上的“不同分支”。可能每个人都在使用
master
,认为自己“在同一个分支上”,但如果你在另一个人工作时按下按钮,那么他们就会从远程拉来更新,这就像远程的代码(
origin/master
)位于与本地代码不同的分支上(只是
master
)。

您显示的图片可能没有提供足够的上下文来明确发生了什么;但我们可以从以下内容开始:黄色提交(标记为“bisect bad”)与“绿色”提交及其后的所有内容位于不同的分支[1],其父级未显示在图片中(在屏幕底部)。结合您的解释,我们可以做出一些有根据的猜测:

很可能我们看到的是

... O -- x -- G -- x -- P1 -- M -- ... <--(HEAD)
     \                       /
      Y -- x -- x -- x -- P2 
(此合并将在“分离头”状态下进行,是一次性合并,只是为了重新创建发生的情况。之后,您可能希望中止合并并签回您的工作分支。)

如果确实有冲突影响了你的功能,那么最有可能的解释是它被错误地解决了。如果是这样,这不是git可以解决的问题-手动冲突解决的要点是工具不能自动决定什么是正确的。有时你不能让工具保护你免受人的伤害他犯了一个错误

(解决合并冲突是一项技能。通常不难看出您应该做什么,但例如,如果另一个分支实际上正在从代码的同一区域删除代码,那么冲突标记可能看起来您的代码只是被删除的块的一部分。)

请注意,任何与您的更改相冲突的更改都不一定在
G
中;它只是介于
O
P2
之间

如果,当你重做合并时,没有冲突,那么下一件事就是看你的合并版本是否仍然包含你的代码;如果没有冲突,那么它应该包含。如果没有冲突,那么需要更多的信息来了解发生了什么-不幸的是,我不知道在那一点上该问什么,除了实际检查电子回购(我敢肯定这一点过于专有)

如果重做合并确实包含您的代码,那么出于某种原因,原始合并是以不同的方式进行的,并且只有执行合并的人才能解释这一点


[1] 在本例中,我使用了提交拓扑意义上的“不同分支”