Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定Git合并删除了一些代码行的原因?_Git - Fatal编程技术网

如何确定Git合并删除了一些代码行的原因?

如何确定Git合并删除了一些代码行的原因?,git,Git,我们发布了一个版本,有问题的提交(daf7110)在历史中被合并回主版本。此时(85a13270),master拥有由daf7110添加的代码行 当我们的一个开发人员将master合并到他的分支(dev分支)中时,代码行消失了。它们在合并开发人员的历史中从未存在过。我通过以下方式验证了这一点: git checkout c513d2 # <--last commit on dev-branch before the merge git log -S string_that_was_adde

我们发布了一个版本,有问题的提交(daf7110)在历史中被合并回主版本。此时(85a13270),master拥有由daf7110添加的代码行

当我们的一个开发人员将master合并到他的分支(dev分支)中时,代码行消失了。它们在合并开发人员的历史中从未存在过。我通过以下方式验证了这一点:

git checkout c513d2 # <--last commit on dev-branch before the merge
git log -S string_that_was_added -- lib/File/It/Was/In.pm

git checkout c513d2#我不知道为什么会发生这种情况,但我可以给出一些调试技巧

首先,我要确保你没有任何奇怪的设置。在没有Git配置的帐户中,对同时具有这两个分支的存储库进行新的克隆。尝试合并。它还会发生吗?如果没有,那么检查你的设置,看看有没有什么奇怪的地方;特别是,我会怀疑任何设置。另外,尝试使用
--no rere autoupdate
进行合并,以查看是否仍会删除有问题的行

在此之后,我将首先打开合并的最大详细度,然后再次尝试进行合并:

GIT_MERGE_VERBOSITY=5 git merge -v master
这将为您提供有关合并过程所做决策的更多信息

如果这并没有告诉你任何有用的东西,你也可以试着看看它是否发生在不同的合并策略中,或者默认的递归合并策略的不同选项中。尝试
git merge-s resolve
尝试一种更简单但更愚蠢的合并策略。你还明白这个问题吗?为递归策略尝试不同的选项,例如
git merge-s recursive-X patience
,怎么样?在启用“额外详细性”的情况下执行最后一个操作,并查看这是否会与默认合并策略做出不同的决策

如果这不起作用,那么是时候尝试手动将其减少到最小的测试用例了。首先,我会尽量把你自己限制在有问题的文件范围内。请确保您正在一次性存储库中工作,并使用
git filter branch
删除所有文件,但有问题的文件中缺少行。当您这样做,并再次尝试进行合并时,您会得到相同的结果吗?如果不是这样的话,可能是因为Git感到困惑,认为这些行移到了另一个文件,而实际上它们并没有移动到另一个文件,所以这些行正在消失

如果您仍然可以用一个文件重现问题,那么是时候开始回溯每个分支的修订历史,进行合并,直到问题消失。例如,从开发分支开始,跳到一半左右,再次尝试合并,看看master中的行是否仍然消失。如果他们这样做了,试着往后跳。如果没有,请沿着开发分支向前跳,然后重试。一旦您找到了在开发端引入问题的提交,请在master上尝试相同的方法,将要合并的提交移回,直到问题消失

现在,您已经尽可能回到过去,请尝试在此之前重新创建历史的简化版本。创建一个新的Git存储库,签入这两个提交的合并基。然后在单独的分支中签入上面跟踪到的两个提交。您可以毫无问题地合并它们吗,或者它是否取决于合并拓扑的某些方面?如果是,请尝试重新创建完整的合并拓扑;仅创建执行历史记录中所有合并所需的提交。这能重现你的问题吗

在这一点上,您应该有最简单的历史来重现问题,只需一个文件来演示它(或者当您无法进一步减少它并重现问题时,您会发现一些有趣的东西)。我建议将此存储库公开发布,以便我们可以查看它,如果该文件中没有任何敏感内容,或者如果有,则尝试进一步缩小它,编辑每个提交以删除所有内容,但删除相关行。您还应该能够用占位符值替换每个相关的行,从而为您留下一个不包含任何实际代码的最小测试用例


以上所有内容都是大量的工作,但希望您在完成所有内容之前会发现一些有趣的东西,或者可以跳过前面的步骤,生成一个最小的测试用例,而不必经过所有的中间步骤。一旦您有了一个更简单的测试用例,或者上述步骤之一的结果,请发布它们,我们可以仔细查看。

我遇到了类似的问题。这似乎是由于这样一个事实:所讨论的代码行首先由提交引入,然后由还原删除。那个分支合并到了主分支


然后在开发分支上重新引入该行,但在将开发分支合并到主分支时,该行被系统地剥离。我假设Git以某种方式跟踪恢复,并假设这一行不需要,应该删除。

愚蠢的问题,但代码行是否与开发人员分支中的某些更改冲突?如果是,他是否用自己的提交覆盖了更改?这似乎是最有可能的。遗憾的是,事实并非如此。实际上,我可以通过重置为c513d2,然后执行“git merge 85a13270”来重复合并,并且合并干净,没有冲突,但是合并后有问题的行消失了。是否启用了Reere?您是否可以在一个小型的自包含存储库中复制该文件并手动进行相同的编辑?我没有启用“重新读取”。我将看看是否可以将repo缩减为一个文件及其提交。您是否可以使用
--完整历史记录
,再次检查日志以确定?我正在运行一个旧版本的git 1.7.0.4git-merge,它只关心相对于合并基的更改,即从两个分支都可以访问的最年轻提交。如果在m中删除了某些内容