我是Git
的新手,正在尝试了解git merge
命令的工作原理。因此,我尝试了一个简单的git项目作为例子:
我有两个分支:master
和b
。你可以在这里查看两者的git日志(1,2,4
是在分支中创建的示例文件):
* cf3456b (HEAD, b) add and modify 4 in b
* 68b9086 edit 1 in branch b
| * 81e6490 (master) remove 1 from branch b1
| * e0a6844 modify 2 in branch b1
| * 06bad1d add2 in branch b1
|/
* c667d3b add 1 in branch master
所以
master
只有一个文件: 2
b
只有两个文件: 1
,4
现在当我尝试执行:
git merge master
我看到了这个消息:
冲突(修改/删除):1在主分支中已被删除,但在HEAD中已被修改。版本HEAD的1留在树中。自动合并失败;解决冲突,然后提交结果。
对我来说这很奇怪,我之前认为:
merge
像checkout
一样尝试从merge in
分支的最新提交中复制内容到merge into
分支的最新提交中,但与checkout
相反,merge
尝试不更改merge into
中的任何文件。最后,如果merge in
和merge into
分支都有相同的文件但状态不同,则会发生冲突。- 我知道
git
只保存文件的快照而不是差异。那么git
如何知道分支的最新提交中的更改呢?(在消息中您可以看到1 deleted in master and modified in HEAD
这些差异)
现在,如果我的想法是正确的,那么文件 1
不应该出现冲突。所以我的想法是不正确的,但是 merge
究竟是如何工作的呢?