繁体   English   中英

Git:在从未在合并源中修改过的文件上是否存在合并冲突?

[英]Git: Can there be merge conflicts on a file that was never modified in the merge source?

TL; DR :从纯粹的理论角度来看,如果分支中的文件从未被修改过(直接创建),则Git是否有可能在分支合并 (而不是重新定级)到master期间报告文件冲突。从大师)?

当我将开发分支合并回master时,经常会遇到文件冲突,这些文件在我的生命中我不记得曾经修改过,甚至无法打开。 因此,我试图了解是否(由于我不太了解Git的工作原理)在特定情况下实际上是可行的,或者相反,这是不可能的,所以我应该专注于显然在我的工作树中修改某些文件的事情却没有引起我的注意(例如,诸如Eclipse中的“保存操作”,自动格式化,行尾处理等)。

我只是在谈论文件冲突,不是在谈论树冲突,也不是在谈论其他可能涉及文件删除,重命名或移动的问题。

这是我非常简单的典型工作流程的示例,将EGit与Eclipse结合使用(始终是最新的):

1 )我从master创建一个dev分支; 我选中“配置上游以进行推送和拉动”复选框,然后在“拉动时”列表框中选择“合并”(其他条目为“ Rebase”,“ Rebase保留合并提交”,“交互式地进行重新设置”)。

没人会犯到分支,本地和远程的, 在所有 只有我,只有一台计算机。

2 )我签出了那个dev分支,有几天我每天都对它进行更改。 每个提交都使用“提交和推送”而不是仅“提交”完成,因为我也希望所有提交也始终位于远程分支上。

在某些情况下,“提交并推送”的“推送”部分会导致“已拒绝-不快进”。 在这种情况下,先执行“拉”再重复执行“推”即可解决问题,一些同事说,通常必须先执行“拉”才能避免“推”导致“不快进”。 但这不是问题。

3 )现在是时候将我的dev分支合并回master了。 我拉,切换回master,拉,选择Merge,选择我的本地dev分支,在“ Merge options”下,选择“ Squash”,在“ Fast Forward options”下,我保留默认值“如果快进,则仅更新分支指针”(其他选项是“如果快进,则创建合并提交”和“如果不是快进,则失败”)。

然后单击“合并”,我得到“结果:冲突”,我去解决那些冲突,在某些情况下,既不是“我的”(主)下红色显示的冲突代码,也不是“他们”下的红色相应代码(我的开发分支)是我写的。 我从未修改过该文件的任何部分,但是在将该分支(从未更改过的分支)合并到master分支中时,它具有冲突的更改。

因此,我的问题是,从纯粹的理论角度来看,是否存在可能的情况,即Git应该在分支合并到master期间报告文件冲突,尽管该文件从未在分支上进行任何修改? 如果是,上述我的工作流程是否属于这种情况之一?

这不是重复这个 ,因为这是关于使用衍合。

更新 -意识到我忘了回到直接回答问题的过程中...


首先,第一件事:如果必须先进行拉动,然后再进行推入,那么其他人正在对您已修改并正在推入的分支进行提交。 按照您的描述,我不能百分百确定-我需要知道特定的命令和配置设置-但我敢打赌,这意味着您会误认为没有其他人提交您的分支。

我之所以这样说,是因为您要问git在理论上是否可以做某事,因为您的观察说它可能正在发生……但是这些观察不是自洽的,因此不能完全正确。

如果分支没有更改,合并会发生吗?

不在您描述的条件下。 ...好吧,好的,您说的是“理论上”,因此我同意,如果您出于某种原因使用了编码为恶意的替代合并工具,则我无法证明这是不可能的。 但是考虑到我的上述评论,我想说我不相信这是怎么回事。

说你有

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

并且您将要合并branchmaster 如果文件foo上存在冲突,则根据定义,这意味着

(A)在x1A之间的某处对foo了更改p1

(B)有一个更改p2应用于foo ,介于o1B之间,并且

(C) p1p2被视为“重叠”

现在可能有很多途径p2躲在那个...该图所示。 例如,也许有人从branch创建了branch2 ,进行了一些更改,然后将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

(如果需要,您可以在冲突标记的branch侧标识的行上包括-L选项,以将零归零;请参阅git blame文档。)

这应该告诉您谁,什么时候以及什么提交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM