我有一个包含一些内容的主分支,比如说文件 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
的作用。它在提交树级别工作,而不是在单个文件级别。
假设您从这里开始,在两个分支上进行了两次提交 A
和 B
:
master --- A # this has *no* README2 file
dev ------ B # this has README2
然后将 dev
分支 merge 到 master
中。
master --- A ----+--- C
/
dev ------ B --/
这会在 master 分支中创建一个新的 merge 提交 (C
)。 C
具有其父代 A
和 B
的历史。这是 README2
被引入 master
分支的地方。
后来,您从 master
分支中删除了 README2
。此文件删除将在 master
分支上生成一个新的提交 (D
)。
master --- A ----+--- C --- D
/
dev ------ B --/
这个新提交D
具有来自master
和dev
的历史记录(由于在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
,其中包含 D
和 E
的历史记录。 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/