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