我今天试图在一个功能分支上执行一个rebase,我陷入了一个非常奇怪的git行为。
基本上我有一个与master发生冲突的分支,一旦我尝试使用新主机重新分支我的分支,我在2个文件中发生了冲突,一个是非常“正常”的合并冲突,但另一个我希望是“添加或删除”冲突,因为主文件中的文件删除尝试与另一个与其无关的文件合并。
我的期望是:
moment.js
我得到了什么:
both modified: file.php
deleted by them: file.js
注意:功能分支中不存在both modified: file.php
both modified: file2.php
。
为什么有任何线索?
答案 0 :(得分:1)
我相信这可以通过了解Git中的变基如何运作来解释。 rebase的第一步是回放功能分支并重放自master
提交的提交,这些提交自最近的共同祖先提交以来发生。然后,自从共同的祖先被重播以来,您提交的提交功能。但这意味着您的提交将位于master
的新基础之上。
如果这让您感到困惑,也许简短的图表可以更好地解释它。考虑一下自共同祖先以来已经对远程master
和feature
分支进行了一次提交的情况:
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
分支也可能在重新应用提交时修改了此文件。