git无法检测到“添加或删除”冲突尝试合并

时间:2018-01-19 10:36:52

标签: git merge rebase

我今天试图在一个功能分支上执行一个rebase,我陷入了一个非常奇怪的git行为。

基本上我有一个与master发生冲突的分支,一旦我尝试使用新主机重新分支我的分支,我在2个文件中发生了冲突,一个是非常“正常”的合并冲突,但另一个我希望是“添加或删除”冲突,因为主文件中的文件删除尝试与另一个与其无关的文件合并。

我的期望是:

moment.js

我得到了什么:

both modified:   file.php
deleted by them:   file.js

注意:功能分支中不存在both modified: file.php both modified: file2.php

为什么有任何线索?

1 个答案:

答案 0 :(得分:1)

我相信这可以通过了解Git中的变基如何运作来解释。 rebase的第一步是回放功能分支并重放自master提交的提交,这些提交自最近的共同祖先提交以来发生。然后,自从共同的祖先被重播以来,您提交的提交功能。但这意味着您的提交将位于master的新基础之上。

如果这让您感到困惑,也许简短的图表可以更好地解释它。考虑一下自共同祖先以来已经对远程masterfeature分支进行了一次提交的情况:

master:   ... A -- B
               \
feature:        C

重新定位的第一步是快退您的feature分支,然后重播master中自共同祖先A以来的提交。这给我们留下了:

master:   ... A -- B
               \
feature:        B       (commit C not yet applied)

最后一步是在重新分支的顶部重新应用feature的提交:

master:   ... A -- B
               \
feature:        B -- C'

在这里,我使用了C'而不仅仅是C,因为从技术上讲,这是一个全新的提交。

为了达到这一点,rebase中发生的事情是你的提交是在不同的分支/基础上进行的。因此,完全有可能与文件file2.php发生冲突,因为它可能存在于您之前的某个提交中。并且master分支也可能在重新应用提交时修改了此文件。