git pull
命令总是会将更新合并到当前分支。因此,你要选择从哪个分支拉取代码,并将其合并到当前分支中。被拉取的分支可以是本地分支或远程分支;甚至可以是一个未在 git remote
中注册的远程分支(也就是说,在 git pull
命令行上传递一个 URL)。 - intuited/home/alice/
目录下执行了 git fetch /home/bob
,接下来如果要执行 git merge
命令,应该传入哪些参数? - ripper234git pull
会在获取提交记录后自动尝试合并。由于其具有上下文敏感性,因此所有获取的提交记录将被合并到您当前活动的分支中。git pull
会自动合并提交记录,不让您事先审查。如果您没有仔细管理分支,可能会经常遇到冲突。
git fetch
会收集目标分支中不存在于当前分支中的任何提交记录,并将它们存储在本地仓库中。然而,它不会与您当前的分支合并。如果您需要将提交记录与当前分支集成,则必须之后使用git merge
。
.git/refs/remotes/origin
目录下的一串哈希值。 - ChrisremoteName/
为前缀。《从底层开始学习 Git》是一篇非常好的阅读材料。一旦您理解了 Git 的工作原理——它真的很简洁——一切都很容易理解。 - Emil Lundberggit merge
- 它应该清楚地显示,单独调用 merge
不同于调用 pull
,因为 pull
仅从远程合并,并忽略您在本地分支中跟踪的远程分支中的本地提交。 - JustAMartingit fetch
的一个用例是,以下命令将告诉您自上次拉取以来远程分支中的任何更改...因此您可以在进行实际拉取之前进行检查,这可能会更改当前分支和工作副本中的文件。
git fetch
git diff ...origin
请参考 git diff
文档,了解双点号..
和三点号...
语法。
fetch
操作本身不会产生冲突。它只是从远程获取变更。冲突通常发生在我们合并变更的过程中。 - undefined我花了一点时间才明白它们之间的区别,但这是一个简单的解释。在您的本地主机中,master
是一个分支。
当你克隆一个存储库时,你会将整个存储库提取到你的本地主机。这意味着此时你有一个指向 HEAD
的 origin/master 指针和一个指向相同 HEAD
的 master。
当您开始工作并提交时,您将使 master 指针前进到 HEAD
+ 您的提交。但是,origin/master 指针仍然指向您克隆时的位置。
因此,它们之间的区别是:
git fetch
,它只会获取远程存储库(GitHub)中的所有更改并将 origin/master 指针移动到 HEAD
。与此同时,您的本地 master 分支将继续指向其原来的位置。git pull
,它基本上会执行 fetch(如前面所述)并将任何新更改合并到您的 master 分支,并将指针移动到 HEAD
。简言之
git fetch
获取更新但不合并。
git pull
在后台执行 git fetch
和 merge
。
详细解释
git fetch
类似于 pull
但不会合并。即它会获取远程的更新(refs
和 objects
),但本地仓库保持不变 (例如 origin/master
更新了,但是 master
仍然保持原样)。
git pull
会从远程拉取最新的内容并立即合并。
git clone
克隆一个仓库。
git rebase
将当前分支中不在上游分支中的更改保存到临时区域。此时你的分支与进行更改前一样。因此,git pull -rebase
会拉取远程更改,回退本地分支,逐个回放你的更改,直到你跟上最新版本。
另外,git branch -a
可以显示所有分支(本地和远程)的情况。
这篇博客文章很有用:
git pull、git fetch 和 git clone (以及 git rebase) 的区别 - Mike Pearce
其中包括 git pull
、git fetch
、git clone
和 git rebase
。
我想更新一下,展示如何在实践中使用这些命令。
从远程更新本地仓库(但不合并):
git fetch
下载更新后,让我们看看有什么不同:
git diff master origin/master
如果您对这些更新感到满意,那么请进行合并:
git pull
注意:
在第2步: 有关本地和远程之间差异的更多信息,请参见:如何比较本地 Git 分支和其远程分支
在第3步: 在一个快速变化的存储库上,可能更准确的做法是在这里执行git rebase origin
。请参见另一个答案中的@Justin Ohms comment。
还可以参考:http://longair.net/blog/2009/04/16/git-fetch-and-merge/
注意:我在pull
过程中提到了merge
,但您也可以配置pull
使用rebase
。
git merge
而不是git pull
吗?因为git fetch
已经发生了。 - Scott Weaver好的,这里有关于git pull
和git fetch
的一些信息,这样你就可以了解实际的区别...用简单的话来说,fetch获取最新的数据,但不获取代码更改,也不会对你当前的本地分支代码进行干扰,而pull获取代码更改并立即合并到你的本地分支,继续阅读以获取更多关于每个命令的详细信息:
它会下载所有的引用和对象以及任何新的分支到你的本地仓库...
从一个或多个其他存储库中获取分支和/或标签(统称为“refs”),以及完成其历史记录所需的对象。远程跟踪分支会被更新(有关控制此行为的方法,请参阅下面的描述)。它将把来自远程的更改应用到本地的当前分支上...
将远程仓库的更改合并到当前分支中。 在默认模式下,git pull是git fetch后跟git merge FETCH_HEAD的简写。
更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支。使用--rebase选项时,它会运行git rebase而不是git merge。
应该是一个远程仓库的名称,如传递给git-fetch1。可以使用来命名任意远程引用(例如标签的名称)或者一组具有相应远程跟踪分支的引用(例如refs/heads/:refs/remotes/origin/),但通常它是远程仓库中的一个分支的名称。
对于和的默认值是从当前分支的"remote"和"merge"配置中读取的,这些配置由git-branch --track设置。
git fetch
和git pull
如何一起工作...
git fetch; git reset --hard origin/master
。它会清除本地更改,让你与主分支保持同步,而且还能确保你不会在当前变更的基础上拉取新变更并搞砸一切。我们已经使用这种方法一段时间了,在实践中感觉更加安全。只需确保先添加/提交/储藏任何正在进行中的工作! - Michael Durrant