Dal*_*vic 2 git merge branch branching-and-merging
我有一个主分支,里面有一些东西,比如说文件 README。我还有一个 dev 分支,master 的子级,还有一些额外的文件,比如说文件 README2。我执行以下操作:
git merge dev
Run Code Online (Sandbox Code Playgroud)
从 master 获取文件 README2 合并到 master。现在我删除它:
git rm README2
Run Code Online (Sandbox Code Playgroud)
现在当我再次合并 dev 时,我预计我会将 README2 文件合并到 master 中,因为它不再在 master 中。但是 Git 报告没有更改,也没有要合并的内容。这实际上适合我,但我不明白这是怎么回事,因为此时分支 dev 显然有 README2 文件,而 master 没有。
你误解了什么git merge。它在提交树级别工作,而不是在单个文件级别。
假设你从这里开始,有两个提交A和B两个分支:
master --- A # this has *no* README2 file
dev ------ B # this has README2
Run Code Online (Sandbox Code Playgroud)
然后你将dev分支合并到master.
master --- A ----+--- C
/
dev ------ B --/
Run Code Online (Sandbox Code Playgroud)
这会C在 master 分支中创建一个新的合并提交 ( )。C有其父母的历史,A并且B。这是README2被带入master分支的地方。
后来,你README2从master分支中移除。此文件删除将D在master分支上生成新的提交 ( ) 。
master --- A ----+--- C --- D
/
dev ------ B --/
Run Code Online (Sandbox Code Playgroud)
这个新提交D具有来自master和的历史记录dev(由于在 处合并C),以及您删除了文件 的事实README2。假设您还对dev(在E下面提交)进行了更改,但它不涉及文件README2.
master --- A ----+--- C --- D
/
dev ------ B --+--- E
Run Code Online (Sandbox Code Playgroud)
现在您dev再次合并到 master 中。
master --- A ----+--- C --- D --+-- F
/ /
dev ------ B --+--- E --------/
Run Code Online (Sandbox Code Playgroud)
您有一个新的合并提交F,其中包含来自D和的历史记录E。master 分支不会README2再次取回文件,因为该文件已在master(in D) 中删除,并且新dev提交E不包含对README2.
此时,如果您修改分支README2上的文件dev,然后尝试将其合并回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.
Run Code Online (Sandbox Code Playgroud)
正如文本所暗示的那样,两国之间存在冲突。在一个分支中,文件已被修改,但在另一个分支中已被删除。不确定要接受哪个,git 放弃并要求您告诉它下一步要做什么。
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |