2017-03-21 146 views
3

'git merge'和'git fetch'有什么区别? 我对这两个命令有一些问题。 我不知道什么时候应该使用其中一种。git merge和git fetch之间的区别?

+1

'git fetch'使用自上一次提取以来已添加到服务器的提交更新本地存储库,而'git merge'将尝试组合两条并行的开发路径。他们完全不同。你有没有考虑阅读git上的许多教程之一,或Pro Git书籍(免费提供[在线](https://git-scm.com/book/en/v2))? –

回答

2

UPDATE - 良好的悲伤,我的合并图整个过程都是错误的。合并不动了“其他”分支的裁判......


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

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

git pull(我知道你并没有问pull但我承担)是从远程像fetch检索数据的速记,然后merge s转换你的当前分支从远程工作的相应行(如果有是“1”;“跟踪信息”决定了这一点)。

例如,假设你有一个包含5个提交的单个分支(master)的远程仓库。

'origin' repo 

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

前一阵子你已经克隆了这个回购;当时只有第一次提交(A)在其中。然后创建了一个新分支(branch1)并做了一些工作,在该分支上创建了一个新的提交(L)。最后,你已经从遥控器中取得了变化;更多关于稍后的工作方式,但现在让我们假设您更新了master以包含B

local repo 

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

注意,除了当地分行裁判(masterbranch1)你有一个远程分支引用(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) 

(在某些情况下 - 只有其中一个分支包含不在其他变化 - 合并能通过“快进”来完成,但因为每个分支有变化并不适用于此 - 即一级支流分歧此外还有另一个叫基础重建有时可以用来分行结合的技术,但这是另一个可以。蠕虫......)

所以这是fetchmerge之间的区别 - 非常不同的操作是做不同的事情。但我也提到了pull这两种结合的方式。如果您执行pull,则首先从远程获取更改(如果尚未完全更新,则使用fetch),然后如果当前分支具有相应的远程分支,则会合并它们。

# still on master 
git pull 

给出类似

 C --- D --- E --- N <--(master)(origin/master) 
    /    /
A --- B --------------- M 
\     /
    L ------------------- <--(branch1) 

(请注意,虽然我通常画这些图使得“直线”进入合并为“第一父”,在这种情况下对于N变得麻烦;但是这确实显示了一般的提交拓扑...)

当我谈论“拉动更改”以获得B到您的本地代表o,它可能已经完成使用git pull

1

git fetch将下载源代码树检查更改,并且git merge将您当前的分支与另一个分支加入。

相关问题