Git merge 不会第二次 merge 文件

标签 git merge branch branching-and-merging

我有一个包含一些内容的主分支,比如说文件 README。我还有一个 dev 分支,master 的子分支,还有一些附加文件,比如说文件 README2。我执行以下操作:

git merge dev

从 master 获取文件 README2 并 merge 到 master 中。现在我将其删除:

git rm README2

现在,当我再次 merge dev 时,我期望将 README2 文件 merge 到 master 中,因为它不再位于 master 中。但 Git 报告没有任何更改,也没有任何要 merge 的内容。这实际上适合我,但我不明白这是怎么回事,因为此时分支 dev 显然有 README2 文件,而 master 没有。

最佳答案

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

假设您从这里开始,在两个分支上进行了两次提交 AB:

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

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

然后将 dev 分支 merge 到 master 中。

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

这会在 master 分支中创建一个新的 merge 提交 (C)。 C 具有其父代 AB 的历史。这是 README2 被引入 master 分支的地方。

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

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

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

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

现在您再次将 dev merge 到 master 中。

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

您有一个新的 merge 提交 F,其中包含 DE 的历史记录。 master 分支不会再次获取文件 README2,因为该文件已在 master 中删除(在 D 中),并且新的 dev 提交 E 不包含对 README2 的更新。


此时,如果您修改 dev 分支上的文件 README2,然后尝试将其 merge 回 master,您将最终导致 merge 冲突。它看起来像这样。

$ 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 放弃并要求你告诉它下一步该做什么。

关于Git merge 不会第二次 merge 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329803/

相关文章:

svn - 颠覆分支问题

Python - 通过同时串联合并两个列表

git - 显示直接提交到分支的提交,忽略 Git 中的 merge

Git:在此树中查找重复的 blob(文件)

git - 恢复 git reset 即使它们不再显示在 repo 上

sql-server - 需要拆分 SQL Server 数据库以进行存档和报告的方法

c# - 合并两个对象数据

git - 如何安全地删除远程 git 分支?

git - 如何找出git分支中更改了哪些文件(不是两个分支之间的区别)

windows - 在 Windows 上通过 node.js 执行 git cmd 失败并出现错误