git merge和git fetch之间的区别?
这个问题在这里已经有了答案:
更新 - 好悲伤,我的合并图整个过程都是错误的。 合并不会移动“其他”分支的ref ...
git fetch
是关于从远程存储库中检索数据的。
git merge
是关于结合多行工作(通常是本地分支,但见下文)的工作。
git pull
(我知道你没有问过关于pull
但是忍受着我)是一种简单的方式,从远程获取数据,如fetch
,然后merge
s merge
到你当前的分支中,从远程(如果有的话) “跟踪信息”确定了这一点。)
例如,假设你有一个包含5个提交的单个分支( master
)的远程仓库。
'origin' repo
A --- B --- C --- D --- E <--(master)
前一阵子你已经克隆了这个回购; 当时只有第一次提交( A
)。 然后创建了一个新的分支(分支branch1
)并做了一些工作,在该分支上创建了一个新的提交( L
)。 最后,你已经从遥控器中取得了变化; 更多关于稍后如何工作的内容,但现在让我们假设你已经更新了包含B
的master
。
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)
(在某些情况下 - 只有一个分支包含不在另一个分支中的变化 - 可以通过“快进”来完成合并;但这不适用于此,因为每个分支都有变化 - 即分支已经分支还有另一种叫rebasing的技术,有时可以用来组合分支,但那是另一种蠕虫......)
所以这就是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
来完成
git fetch
会下载源码树来检查更改,而git merge
会将你当前的分支与另一个分支联系起来。