Git merge 不会第二次合并一个文件

Git merge doesn't merge a file the second time

我有一个 master 分支,里面有一些东西,比方说文件 README。我还有一个 dev 分支,master 的子分支,还有一些额外的文件,比方说文件 README2。我执行以下操作:

git merge dev

从 master 获取文件 README2 合并到 master 中。现在我删除它:

git rm README2

现在,当我再次合并 dev 时,我预计我会将 README2 文件合并到 master 中,因为它不再在 master 中了。但是 Git 报告没有任何更改,也没有要合并的内容。这其实很适合我,但我不明白这是怎么回事,因为此时分支 dev 显然有 README2 文件,而 master 没有。

发生这种情况是因为通过从 git 跟踪系统中删除 README2 文件,它将忽略您将来可能对其进行的任何更改,这也可能涉及包含该文件的合并。如果你制作 git status 你可能会在那里看到文件作为一个未跟踪的文件。

我希望这对您有所帮助,如果您想实际删除该提交中的文件而不是执行 git rm README2 您可以简单地删除该文件并且 git 会将其注册为文件删除而不是取消命令。

您误解了 git merge 的作用。它在提交树级别工作,而不是在单个文件级别。

假设您从这里开始,在两个分支上有两个提交 AB

master --- A      # this has *no* README2 file

dev ------ B      # this has README2

然后您将 dev 分支合并到 master

master --- A ----+--- C
                /
dev ------ B --/

这会在 master 分支中创建一个新的合并提交 (C)。 C 有其 parents、AB 的历史。这是 README2 被带入 master 分支的地方。

稍后,您从 master 分支中删除了 README2。此文件删除将在 master 分支上生成新的提交 (D)。

master --- A ----+--- C --- D
                /
dev ------ B --/

这个新提交 D 具有来自 masterdev 的历史记录(由于在 C 合并),加上您删除文件 README2。假设您还对 dev 进行了更改(在下面提交 E),但它不涉及文件 README2.

master --- A ----+--- C --- D
                /
dev ------ B --+--- E

现在您再次将 dev 合并到 master 中。

master --- A ----+--- C --- D --+-- F
                /              /
dev ------ B --+--- E --------/

您有一个新的合并提交 F,它具有来自 DE 的历史记录。 master 分支没有再次获取文件README2,因为该文件已经在master(在D)中被删除,并且新的dev提交E 不包含对 README2.

的更新

此时,如果您在 dev 分支上修改文件 README2,然后尝试将其合并回 master,您最终会遇到合并冲突。它看起来像这样。

$ git merge dev
CONFLICT (modify/delete): README2 deleted in HEAD and modified in dev. Version dev of README2 left in tree.
Automatic merge failed; fix conflicts and then commit the result.

正如文中所说,这两种状态之间存在冲突。在一个分支中,文件已被修改,但在另一个分支中已被删除。不确定接受哪一个,git 放弃并要求您告诉它下一步该做什么。