2017-06-15 36 views
0

TL; DR:从纯理论的角度来看,是有可能的Git的合并过程中的一个文件报告冲突(不重订)的一个分支进入主如果该文件从未被所有修改的分支(它是直接从主创建的)?Git:在合并源中从未修改过的文件上是否会存在合并冲突?

当我将我的开发分支合并回主人时,我常常遇到文件上的冲突,这些文件对于我来说我不记得曾经修改 - 甚至打开过。所以我想了解是否 - 给定Git如何工作,哪些我不太了解 - 这在实际情况下可能是实际可行的,或者如果这是不可能的,那么我应该关注某些显然修改工作树中某些文件的内容没有我注意到(f.ex.类似Eclipse中的Save Actions,自动格式化,行尾处理等)。

我只是在谈论文件冲突,而不是树冲突,或者其他任何可能涉及文件删除或重新命名或移动的事情。

这是我的非常简单的典型的工作流程的例子,例如:It使用用Eclipse(始终是最新的):

)创建从主一个Dev分支;我勾选了“为推拉配置上游”复选框,并在“拉取时”列表框中选择“合并”(其他条目为“重新部署”,“保留合并提交的重新保存”,“交互重新配置”)。

没有人会致力于该分支,本地和远程,在所有只有我和只有一台电脑。

)我检查开发分支,并在几天内我每天都会对其进行更改。每一次提交都使用“提交和推送”而不是“提交”来完成,因为我希望我的所有提交都始终在远程分支上。

在某些情况下,我的“提交和推送”的推送部分导致“拒绝 - 不快进”。在这种情况下,执行“Pull”并重复推送解决方案,并且一些同事说,必须先执行Pull以避免Push导致“不快速前进”,这是正常的。但这不是问题。

)现在需要将我的开发分支合并回主。我拉,切换回主,拉,选择合并,选择我的本地开发分支,在“合并选项”下我选择“壁球”,在“快进选项”我离开默认“如果快进,只更新分支指针“(其他选项是”如果快进,创建合并提交“和”如果不是快进,失败“)。

然后我单击合并,然后得到“结果:冲突”,我去解决这些冲突,并且在某些情况下,既没有在“我的”(主)下显示为红色的冲突代码,也没有在“他们的“(我的开发部门)是我写的东西。我从来没有在任何部分修改过这个文件,但是当把这个文件从未改变过的分支合并到主文件中时,它的变化却发生了冲突。

所以我的问题是,从纯理论的角度来看,Git是否应该在分支合并到主文件时报告文件冲突,尽管该文件在分支上从未被修改过?如果是的话,我的工作流程是否符合上述情况之一?

这不是this的重复,因为这是关于使用rebase。

+1

我们也遇到了无法解释的冲突,我认为我们在本例中对此进行了解释:有人对其他分支进行了提交。由于其他分支是该产品的旧版本(但仍然保留),因此这一提交与我们最新分支上的代码不兼容。然而,我们将旧分支合并到较新的分支以带来错误修正,因此从旧分支到我们当前分支完成虚拟合并,使用“我们的策略”忽略更改,然后重新实现。后来的合并在合并到其他分支时产生了冲突。 –

+0

@ LasseV.Karlsen谢谢;我没有足够的技巧来判断这样的解释是否表明事实上完全可能,当我的分支合并到主分支中时,对于那些从未在该分支上修改过的文件产生冲突,但它确实听起来如此,更重要的是,让我意识到可能有其他团队成员可以做的事情 - 不是我的分支,而是主人 - 当我将分支合并到主人中时,最终会产生这些无法解释的冲突;我会试着去理解这种可能性是否真的存在,因为这可能是真正发生的事情。 – SantiBailors

+1

当我们合并到主分支(您的案例中的主分支)时,我们特别使用'-s our'策略合并了“忽略来自其他分支的更改”。然而,当后来将这个分支合并到一个特性分支中以使其更新以修复我们**引入的合并冲突时,我们也收回了我们特别想要的那个其他分支的所有合并冲突忽视。最终,当这个策略合并之前我们没有创建更多的功能分支时,问题就消失了,但当它持续时,这是一个痛苦。 –

回答

1

更新 - 意识到我忘了要回直接回答这个问题......


首先第一件事情:如果你有拉,然后才能推动,那么别人正在提交在你修改并推动的分支上。根据你的描述,我不能100%肯定 - 我需要知道具体的命令和配置设置 - 但我敢打赌,这意味着你误认为没有其他人正在向你的分支承诺。

我提到这个是因为你问git是否理论上可以做点什么,因为你的观察说它可能正在发生......但是那些观察不是自洽的,所以不能完全正确。

当分支没有变化时可以发生合并吗?

不符合您所描述的条件。 ...好的,你说的是“理论上的”,所以我会承认,如果你出于某种原因使用了代码为恶意的替代合并工具,我不能证明这是不可能的。但鉴于我的上述评论,我会说我不相信这是发生在这里。

说你有

R -- x1 ... xN -- A <--(master) 
\ 
    o1 ... oN -- B <--(branch) 

,你想说的话的branch合并为master。如果存在于文件foo一个冲突,则根据定义,这意味着

(A)有一个变化p1这是x1A之间施加foo某处,

(B)有一个变化p2这是o1B,和

之间施加 foo某处

(C)p1p2被视为 “重叠”

现在可以有很多方法让p2隐藏在图表中的...后面。例如,也许有人创建branch2branch,做了一些更改,并合并branch2回到branch。但合并回branch仍然是“在那种情况下别人更改提交到branch(和合并的外观承诺会当你要拉你可以推前的一个例子)。

那么如何分辨什么是真正发生了什么?

如果git的报告发生冲突,你可以得到一些想法是什么它通过查看冲突标记的想法。如果它只是一个你不记得了变化的事情,也许他们会看起来很熟悉?但听起来这不是这种情况。

(以下命令假定合并仍是未完成的;如果合并以来,一直致力于,那么你会使用类似master^..branch;点在部分..有指master提交合并之前之前。 )

所以,你可以看到提交过影响的文件(但不是master)的东西,如

git log master..branch -- path/to/conflicted/file 

如果不把它清除掉,另一步是将尝试

git blame master..branch -- path/to/conflicted/file 

(如果需要,您可以包含-L选项以将冲突标记的branch一侧上标识的线路清零;请参阅git blame文档。)

这应该告诉你谁,何时以及在哪些提交中。

+0

感谢您的好评!它将需要一段时间来处理它。与此同时,我很乐意解决我观察中缺乏一致性的问题,但我需要清楚这是什么;如果是这样的说法,尽管冲突除我之外没有人承诺开发分支,但我必须证实这一点,这是我提出这个问题的主要原因,但是下次发生冲突时我会尝试截取冲突的截图和分支历史显示没有人在那里犯下;如果不一致的地方在其他地方,请将我指给他们。 – SantiBailors

+0

我还必须确认,尽管实际需要拉动以避免导致“拒绝,不快速前进”,但没有人承诺过该分支;当我推送时,我经常会得到“拒绝”,所以我拉,然后再次推送,这次它成功了,而我推送的远程分支只有我(和本地分支)提交,因为问题),从创建开始。我也会在下次发生这种情况时尝试使用屏幕截图来记录这一点。 – SantiBailors

+0

我对Git的有限理解在这里肯定起着很大的作用; re _...然后别人在你修改并推送的分支上进行提交,是否包含除了包含我试图推送的提交的当前签出分支以外的分支?我仍然有理由相信,我有这个问题的所有分支,本地和远程,只接收来自我的提交,但我从不验证是否f.ex。虽然我有分支机构A检出,我推动,但分支B仍然从我的本地回购已经unpushed提交(尽管,我总是点击“提交和推送”),但不太可能。 – SantiBailors