更新 - 很遗憾,我的合并图一直都是错误的。合并不会移动“其他”分支的引用...
git fetch 是关于从远程存储库中检索数据。
git merge 是关于将多行工作(通常是本地分支机构,但见下文)的工作结合起来。
git pull(我知道你没有问过pull,但请耐心等待)是从远程检索数据的速记,如fetch,然后merges 进入您当前分支的相应行远程工作(如果有的话;“跟踪信息”决定了这一点。)
例如,假设您有一个包含 5 个提交的单个分支 (master) 的远程存储库。
'origin' repo
A --- B --- C --- D --- E <--(master)
不久前你已经克隆了这个 repo;当时只有第一个提交(A)在其中。然后,您创建了一个新分支 (branch1) 并做了一些工作,在该分支上创建了一个新提交 (L)。最后,您从遥控器中提取了更改;稍后会详细了解它的工作原理,但现在让我们假设您更新了 master 以包含 B。
local repo
A --- B <--(master)(origin/master)
\
L <-- (branch1)
请注意,除了您的本地分支引用(master 和 branch1)之外,您还有一个远程分支引用(origin/master),目前恰好与 master 相同。
现在,如果您想更新本地存储库以包含来自源的所有数据,但不合并任何内容,您会说
git fetch
然后你就有了
C --- D --- E <--(origin/master)
/
A --- B <--(master)
\
L <-- (branch1)
这是一个获取 - 只需从远程获取数据。
您明确要求merge 的主要原因是将branch1 的工作与master 结合起来。所以
git checkout master
git merge branch1
(然后可能解决任何冲突),你现在有
C --- D --- E <--(origin/master)
/
A --- B --- M <--(master)
\ /
L ------- <--(branch1)
(在某些情况下 - 只有一个分支包含另一个分支中没有的更改 - 可以通过“快进”完成合并;但这不适用于这里,因为每个分支都有更改 - 即分支有发散。还有另一种称为rebaseing的技术,有时可以用来组合分支;但那是另一种蠕虫......)
这就是fetch 和merge 之间的区别——非常不同的操作做不同的事情。但我也提到了pull 哪种结合了两者。如果您执行pull,首先它会从远程拉取更改(以防您尚未完全使用fetch 进行更新),然后如果当前分支有对应的远程分支,则合并它们。
# still on master
git pull
给出类似的东西
C --- D --- E --- N <--(master)(origin/master)
/ /
A --- B --------------- M
\ /
L ------------------- <--(branch1)
(请注意,虽然我通常绘制这些图表,使得进入合并的“直线”是“第一个父级”,在这种情况下,N 变得很麻烦; 但这确实显示了一般的提交拓扑......)
当我谈到“引入更改”以将 B 放入本地存储库时,很可能已经使用 git pull 完成