Git合并和Git获取之间的区别?


Difference between git merge and git fetch?

本问题已经有最佳答案,请猛点这里访问。

"git merge"和"git fetch"有什么区别?这两个命令我有些问题。我不知道什么时候该用这个或那个。


更新-很遗憾,我的合并图表一直都是错误的。合并不会移动"其他"分支的引用…

git fetch是关于从远程存储库中检索数据。

git merge是关于组合来自多个工作行(通常是本地分支,但见下文)的工作。

git pull(我知道你没有问过pull的事,但请原谅)是一个速记,它从远程(如fetch检索数据,然后merge从远程(如有)到你当前的分支,相应的工作线就从远程(如有,"跟踪信息"决定了这一点)。

例如,假设您有一个远程回购,其中一个分支(master)包含5个提交。

1
2
3
'origin' repo

A --- B --- C --- D --- E <--(master)

不久前,您克隆了这个repo;当时只有第一个commit(A)在其中。然后您创建了一个新的分支(branch1并做了一些工作,在该分支上创建了一个新的commit(L)。最后,您从远程引入了一些更改;更多关于以后如何工作的内容,但现在我们假设您更新了您的master以包含B

1
2
3
4
5
local repo

A --- B <--(master)(origin/master)
 \
  L <-- (branch1)

请注意,除了您的本地分支引用(masterbranch1外,您还有一个远程分支引用(origin/master,目前它恰好与master相同。

现在,如果您希望更新本地回购,以包含来自源站的所有数据,但不合并任何内容,您可以说

1
git fetch

然后你就有了

1
2
3
4
5
        C --- D --- E <--(origin/master)
       /
A --- B <--(master)
 \
  L <-- (branch1)

这是一个获取-从远程获取数据。

你明确要求使用merge的主要原因是将你在branch1的工作与你的master结合起来。所以

1
2
git checkout master
git merge branch1

(然后可能解决任何冲突)现在

1
2
3
4
5
        C --- D --- E <--(origin/master)
       /
A --- B --- M <--(master)
 \         /
  L ------- <--(branch1)

(在某些情况下-只有一个分支包含另一个分支中没有的更改-可以通过"快进"完成合并;但由于每个分支都有更改,因此此处不适用,即分支已经分叉。还有另一种技术叫做重新平衡,有时可以用来组合分支;但那是另一种蠕虫……)

所以这就是fetchmerge之间的区别——非常不同的操作执行不同的事情。但我也提到了pull是哪种组合。如果您执行pull,首先它从远程提取更改(如果您还没有用fetch完全更新),然后如果当前分支有一个对应的远程分支,它会合并它们。

1
2
# still on master
git pull

给人的感觉

1
2
3
4
5
        C --- D --- E --- N <--(master)(origin/master)
       /                 /
A --- B --------------- M
 \                     /
  L ------------------- <--(branch1)

(请注意,虽然我通常绘制这些图表时,合并中的"直线"是"第一个父级",但在这种情况下,N会变得很麻烦;但这确实显示了一般的提交拓扑…)

当我谈到"引入变化"以使B进入您的本地回购时,很可能是使用git pull完成的。


git fetch将下载源树以检查更改,git merge将当前分支与另一个分支联接。