#39;git pull#39;和#39;git fetch#39;有什么区别?
主持人注意:鉴于此问题已经发布了67个答案 (其中一些已删除),请在发布另一个问题之前考虑您是否正在贡献新内容 。
git pull
和git fetch
什么区别?
#1楼
我花了一点时间来了解有什么区别,但这只是一个简单的解释。 本地master
中的master
是分支。
克隆存储库时,会将整个存储库提取到本地主机。 这意味着到那时您有一个指向HEAD
的原点/主指针和指向同一HEAD
主指针。
当您开始工作并提交时,您可以将主指针前进到HEAD
+您的提交。 但是原始/主指针仍然指向克隆时的状态。
因此区别将是:
- 如果执行
git fetch
,它将仅获取远程存储库( GitHub )中的所有更改,并将origin / master指针移至HEAD
。 同时,您的本地分支主管将继续指向其所在位置。 - 如果您执行
git pull
,它将基本上进行提取(如前所述)并将所有新更改合并到您的master分支中,并将指针移至HEAD
。
#2楼
我也为此感到挣扎。 实际上,我是通过Google搜索完全相同的问题来到这里的。 读完所有这些答案后,我的脑海中终于有了一幅图画,我决定尝试着眼于2个存储库和1个沙箱的状态以及随着时间推移执行的操作,同时观察它们的版本。 这就是我的想法。 如果我在任何地方搞砸了,请纠正我。
三个回购协议:
--------------------- ----------------------- -----------------------
- Remote Repo - - Remote Repo - - Remote Repo -
- - - gets pushed - - -
- @ R01 - - @ R02 - - @ R02 -
--------------------- ----------------------- -------------------------------------------- ----------------------- -----------------------
- Local Repo - - Local Repo - - Local Repo -
- pull - - - - fetch -
- @ R01 - - @ R01 - - @ R02 -
--------------------- ----------------------- -------------------------------------------- ----------------------- -----------------------
- Local Sandbox - - Local Sandbox - - Local Sandbox -
- Checkout - - new work done - - -
- @ R01 - - @ R01+ - - @R01+ -
--------------------- ----------------------- -----------------------
三个回购
--------------------- ----------------------- -----------------------
- Remote Repo - - Remote Repo - - Remote Repo -
- - - gets pushed - - -
- @ R01 - - @ R02 - - @ R02 -
--------------------- ----------------------- -------------------------------------------- ----------------------- -----------------------
- Local Repo - - Local Repo - - Local Repo -
- pull - - - - pull -
- @ R01 - - @ R01 - - @ R02 -
--------------------- ----------------------- -------------------------------------------- ----------------------- -----------------------
- Local Sandbox - - Local Sandbox - - Local Sandbox -
- Checkout - - new work done - - merged with R02 -
- @ R01 - - @ R01+ - - @R02+ -
--------------------- ----------------------- -----------------------
这有助于我理解为什么获取非常重要。
#3楼
git fetch
将检索远程分支,以便您可以git diff
或git merge
它们与当前分支git merge
。 git pull
将在当前分支跟踪的远程分支上运行访存,然后合并结果。 您可以使用git fetch
查看远程分支是否有任何更新,而不必将其与本地分支合并。
#4楼
我们只是说:
git pull == git fetch + git merge
如果运行git pull
,则不需要将数据合并到本地。 如果运行git fetch
,则意味着必须运行git merge
才能将最新代码获取到本地计算机。 否则,如果不合并,将不会更改本地机器代码。
因此,在Git Gui中,当您提取数据时,必须合并数据。 提取本身不会在您的本地更改代码。 您可以通过一次获取并查看来检查更新代码时的代码。 不会更改的代码。 然后合并...您将看到更改的代码。
#5楼
将git的设计原理与更传统的源代码控制工具(如SVN)的原理进行对比很重要。
Subversion是使用客户端/服务器模型设计和构建的。 服务器是一个单一的存储库,几个客户端可以从服务器获取代码,对其进行处理,然后将其提交回服务器。 假定客户端在需要执行操作时可以始终与服务器联系。
Git旨在支持一种更加分布式的模型,而无需一个中央存储库(尽管您当然可以使用一个存储库)。 还设计了git,以便客户端和“服务器”不需要同时处于联机状态。 Git的设计目的是使链接不可靠的人甚至可以通过电子邮件交换代码。 可以完全断开连接并刻录CD以通过git交换代码。
为了支持该模型,git会使用您的代码维护一个本地存储库,以及一个附加的本地存储库,以反映远程存储库的状态。 通过在本地保留远程存储库的副本,即使无法访问远程存储库,git也可以找出所需的更改。 稍后,当您需要将更改发送给其他人时,git可以将它们作为一组更改从远程存储库已知的时间点进行传输。
git fetch
是说“使远程存储库的本地副本最新”的命令。git pull
说“将远程存储库中的更改带到我自己保存代码的位置。”
通常, git pull
通过执行git fetch
来使远程存储库的本地副本保持最新,然后将更改合并到您自己的代码存储库以及可能的工作副本中来实现。
要记住的是,您的工作站上通常至少有三个项目的副本 。 一个副本是您自己的存储库,具有自己的提交历史记录。 第二个副本是您正在编辑和构建的工作副本。 第三个副本是远程存储库的本地“缓存”副本。
#6楼
简要地
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的其他回答。
另请参阅: http : //longair.net/blog/2009/04/16/git-fetch-and-merge/
#7楼
git pull
和git fetch
之间的唯一区别是:
git pull
从远程分支中提取并合并。
git fetch
仅从远程分支获取,但不合并
即git pull = git fetch + git merge ...
#8楼
git fetch
将代码从远程服务器下拉到本地存储库中的跟踪分支。 如果您的远程origin/master
被命名为origin
(默认),则这些分支将位于origin/
,例如origin/master
, origin/mybranch-123
等。这些不是您当前的分支,它们是服务器中这些分支的本地副本。 。
git pull
会执行git fetch
但还会将代码从跟踪分支合并到该分支的当前本地版本中。 如果您还没有准备好进行更改,则只需先git fetch
。
#9楼
git pull ==(git fetch + git merge)
git fetch不会更改为本地分支。
如果您已经有一个本地存储库,并为所需项目设置了远程设置,则可以使用git fetch获取现有远程设备的所有分支和标签。 ...提取不会对本地分支进行任何更改,因此您需要将远程分支与成对的本地分支合并以合并新的提取更改。 来自github
#10楼
Git允许按时间顺序将较早的提交应用于较新的提交。 因此,在存储库之间传输提交的操作分为两个步骤:
将新的提交从远程分支复制到本地仓库中的该远程分支的副本。
(回购到回购操作)
master@remote >> remote/origin/master@local
将新提交集成到本地分支
(内部回购操作)
remote/origin/master@local >> master@local
有两种方法可以执行步骤2。您可以:
- 在最后一个共同祖先之后分叉本地分支,并添加与本地存储库独有的提交平行的新提交,通过合并提交,关闭分叉来最终确定。
- 在最后一个共同祖先之后插入新提交,然后重新应用本地存储库唯一的提交。
用git
术语,第1步是git fetch
,第2步是git merge
或git rebase
git pull
是git fetch
和git merge
#11楼
我喜欢对情况有一些直观的了解,以掌握这些东西。 也许其他开发人员也希望看到它,所以这是我的补充。 我不确定这是否正确,如果发现任何错误,请发表评论。
LOCAL SYSTEM. =====================================================
================= . ================= =================== =============
REMOTE REPOSITORY . REMOTE REPOSITORY LOCAL REPOSITORY WORKING COPY
(ORIGIN) . (CACHED)
for example, . mirror of the
a github repo. . remote repo
Can also be .
multiple repo's ...
FETCH *------------------>*
Your local cache of the remote is updated with the origin (or multiple
external sources, that is git's distributed nature).
PULL *-------------------------------------------------------->*
changes are merged directly into your local copy. when conflicts occur,
you are asked for decisions..
COMMIT . *<---------------*
When coming from, for example, subversion, you might think that a commit
will update the origin. In git, a commit is only done to your local repo..
PUSH *<---------------------------------------*
Synchronizes your changes back into the origin.
拥有远程镜像的一些主要优点是:
- 性能 (滚动所有提交和消息,而无需尝试通过网络进行压缩)
- 关于您本地仓库状态的反馈 (例如,我使用Atlassian的SourceTree,这将为我提供一个灯泡,指示相对于原产地,我是在前还是在后。该信息可以用GIT FETCH更新)。
#12楼
Git使用两个命令获取从远程到本地的最新版本的分支:
git fetch:Git将从远程到本地获取最新版本,但是不会自动合并。
git fetch origin master
git log -p master..origin/master
git merge origin/master
上面的命令意味着从远程将主分支的最新版本从远程下载到起源主分支。 然后比较本地主分支和原始主分支。 最后,合并。
git pull:Git将从远程获取最新版本并合并到本地。
git pull origin master
上面的命令等效于
git fetch
和git merge
。 实际上,git fetch
可能更安全,因为在合并之前,我们可以看到更改并决定是否合并。
#13楼
git fetch
一个用例是,以下内容将告诉您自上次拉取以来远程分支中的任何更改...,因此您可以在执行实际拉取之前进行检查,这可能会更改当前分支和工作副本中的文件。
git fetch
git diff ...origin
有关diff命令中的双点和三点语法,请参见: https ://git-scm.com/docs/git-diff
#14楼
这种交互式的图形表示形式对于理解git很有帮助: http : //ndpsoftware.com/git-cheatsheet.html
git fetch
只是将更改从远程“下载”到本地存储库。 git pull
下载更改并将其合并到当前分支中。 “在默认模式下, git pull
是git fetch
简写,其次是git merge FETCH_HEAD
。”
#15楼
用最简单的术语来说, git pull
进行git fetch
然后进行git merge
。
您可以随时执行git fetch
来更新refs/remotes/<remote>/
下的远程跟踪分支。
此操作绝不会更改refs/heads
下您自己的任何本地分支,并且可以安全地执行而不更改您的工作副本。 我什至听说有人在后台执行cron作业中定期运行git fetch
(尽管我不建议这样做)。
git pull
是您要执行的操作,以使本地分支的远程版本保持最新,同时还更新其他远程跟踪分支。
Git文档– git pull :
在默认模式下,
git pull
是git fetch
简写,其次是git merge FETCH_HEAD
。
#16楼
git-pull - Fetch from and merge with another repository or a local branch SYNOPSISgit pull … DESCRIPTIONRuns git-fetch with the given parameters, and calls git-merge to merge the retrieved head(s) into the current branch. With --rebase, calls git-rebase instead of git-merge.Note that you can use . (current directory) as the <repository> to pull from the local repository — this is useful when merging local branches into the current branch.Also note that options meant for git-pull itself and underlying git-merge must be given before the options meant for git-fetch.
如果您希望合并历史记录,那么您会选择拉扯;如果您只是“想要编码解码器”,那么您会获取,因为有人在这里标记了一些文章。
#17楼
git pull
和git fetch
什么区别?
要了解这一点,您首先需要了解本地git不仅维护本地存储库,而且还维护远程存储库的本地副本。
git fetch
使您的远程存储库本地副本保持最新状态。 例如,如果您的远程存储库是GitHub-您可能希望将远程存储库中所做的所有更改都提取到远程存储库的本地副本中。 这将允许您执行比较或合并之类的操作。
另一方面, git pull
会将远程存储库中的更改放到保留您自己的代码的位置。 通常, git pull
将首先执行git fetch
以使远程存储库的本地副本保持最新,然后将更改合并到您自己的代码存储库中,并可能合并到您的工作副本中。
#18楼
这是奥利弗·斯蒂尔 ( Oliver Steele)关于所有这些如何组合的图像 :
如果有足够的兴趣,我想我可以更新图像以添加git clone
和git merge
...
#19楼
git pull = git fetch + git merge
#20楼
力求清晰和简单。
git pull命令实际上是git fetch的shortcut
,其后是git merge或git rebase命令,具体取决于您的配置。 您可以配置您的Git存储库,以便git pull是先获取后是重新建立基础。
#21楼
实际上,Git维护您自己的代码和远程存储库的副本。
git fetch
命令通过从远程存储库获取数据来使本地副本保持最新状态。 我们之所以需要这样做,是因为其他人可能已经对代码进行了一些更改,而您想保持自己的最新状态。
git pull
命令将远程存储库中的更改带到您保留自己的代码的位置。 通常, git pull
通过执行“ git fetch”来做到这一点,以使远程存储库的本地副本保持最新,然后将更改合并到您自己的代码存储库以及可能的工作副本中。
#22楼
奖金:
说到上述答案中的“提取与提取”,我想分享一个有趣的技巧,
git pull --rebase
上面的命令是我的git一生中最有用的命令,它节省了很多时间。
在将新的提交推送到服务器之前,请尝试使用此命令,它将自动同步最新的服务器更改(通过访存+合并),并将您的提交放在git日志的顶部。 无需担心手动拉/合并。
有关详细信息,请访问: http : //gitolite.com/git-pull--rebase
#23楼
有时视觉表示会有所帮助。
#24楼
Git获取
您可以将更改从源下载到本地分支下载。 Fetch向远程存储库询问其他人进行的所有提交,但您没有在本地存储库上进行的提交。 Fetch下载这些提交并将其添加到本地存储库。
Git合并
您可以使用merge命令应用通过提取下载的更改。 合并将采用从提取中检索的提交,并尝试将它们添加到本地分支。 合并将保留本地更改的提交历史记录,这样,当您与push共享分支时,Git将知道其他人如何合并您的更改。
吉特拉
提取和合并经常一起运行,以至于创建了将两者(合并)的命令。 Pull先进行提取,然后进行合并以将下载的提交添加到本地分支中。
#25楼
GIT Fetch和GIT Pull之间的区别可以用以下情况来解释:( 请记住,图片说得比单词要响!!,我提供了图片表示)
让我们举个例子,您正在与团队成员一起进行项目。 因此,他们将成为项目的一个主要分支,所有贡献者必须将其分叉到自己的本地存储库,然后在该本地分支上进行修改/添加模块,然后再推送回主要分支。
因此,当您在本地存储库中分叉主项目时,两个分支的初始状态将如下所示(( A
, B
和C
是该项目已经完成的模块)
现在,您已经开始研究新模块(假设D
),并在完成D
模块后将其推入主分支,但是同时发生的是,您的一个队友已经开发了新的E
, F
和修改后的C
因此,现在发生的事情是您的本地存储库缺少项目的原始进度,因此将更改推送到主分支可能会导致冲突,并可能导致模块D
发生故障。
为避免此类问题并与项目的原始进度并行进行,它们有两种方法:
1. Git Fetch-将下载对Origin / main分支项目所做的所有更改,这些更改在您的本地分支中不存在。 并且将等待Git Merge命令将已获取的更改应用于您的存储库或分支。
因此,现在您可以在将文件合并到存储库之前仔细监视文件。 并且由于修改了C
,您还可以根据需要修改D
2. Git Pull-这会用origin / main分支更新您的本地分支,即,实际上它是Git Fetch和Git的合并一个接一个的组合。 但这可能会导致发生冲突,因此建议在干净副本中使用Git Pull。
#26楼
好的 ,这是有关git pull
和git fetch
一些信息,因此您可以了解实际的区别...简单来说, fetch可以获取最新数据,但不会更改代码,也不会与您当前的本地分支代码混淆,但拉得到的代码的变化和合并在您的本地分支,请继续阅读以获取有关每个更多详细信息:
git获取
它将所有引用和对象以及任何新分支下载到本地存储库中。
从一个或多个其他存储库中获取分支和/或标签(统称为“ refs”),以及完成其历史记录所需的对象。 远程跟踪分支已更新(有关控制此行为的方法,请参见下面的说明)。
默认情况下,任何指向要获取的历史记录的标记也将被获取; 效果是获取指向您感兴趣的分支的标记。可以使用--tags或--no-tags选项或通过配置remote..tagOpt来更改此默认行为。 通过使用显式获取标签的refspec,您还可以获取不指向您感兴趣的分支的标签。
git fetch既可以从单个命名存储库或URL进行获取,也可以一次从多个存储库获取(如果给出)并且有一个远程目录。 配置文件中的条目。 (请参阅git-config 1 )。
如果未指定任何远程,默认情况下将使用源远程,除非为当前分支配置了上游分支。
获取的ref的名称以及它们指向的对象名称将写入.git / FETCH_HEAD。 脚本或其他git命令(例如git-pull)可以使用此信息。
git pull
它将更改从远程应用于本地的当前分支 ...
将更改从远程存储库合并到当前分支。 在其默认模式下,git pull是git fetch的缩写,其后是git merge FETCH_HEAD。
更精确地讲,git pull使用给定的参数运行git fetch并调用git merge将检索到的分支头合并到当前分支中。 使用--rebase,它将运行git rebase而不是git merge。
应该是传递给git-fetch 1的远程存储库的名称。 可以命名任意的远程引用(例如,标记名称),甚至可以命名具有相应远程跟踪分支的引用集合(例如refs / heads / :refs / remotes / origin / ),但通常是名称远程存储库中的分支。
从git-branch --track设置的当前分支的“远程”和“合并”配置中读取和的默认值。
我还将在下面创建视觉效果 ,以向您展示git fetch
和git pull
如何协同工作...
#27楼
一个适合初学者的简单图形表示,
这里,
git pull
将从存储库中获取代码并使用您的本地库进行基础...在git pull中,可能会创建新的提交。
但在 ,
git获取
将从存储库中获取代码,我们需要使用git rebase
手动对其重新设置基础
例如:我要从服务器主服务器获取并将其重新放置在本地主服务器中。
1)git pull(变底会自动完成):
git pull origin master
这里起源远程回购主是你的分支
2)git fetch(需要手动重新设置基准):
git fetch origin master
它将从源获取服务器更改。 并且它将一直存在于您的本地环境中,直到您自己重新建立基础为止。 我们需要通过检查代码来手动解决冲突。
git rebase origin/master
这会将代码重新打包为本地代码。 在此之前,请确保您在正确的分支中。
#28楼
您可以从远程存储库中获取内容,查看差异,然后进行合并。
这是一个名为origin
的远程存储库和一个名为master
的分支的示例,该分支跟踪远程分支的origin/master
:
git checkout master
git fetch
git diff origin/master
git rebase origin master
#29楼
简短而简单的答案是git pull
是git fetch
然后是git merge
。
请务必注意, 无论您是否喜欢 git pull
都会自动合并 。 当然,这可能会导致合并冲突。 假设您的远程服务器是origin
而您的分支机构是master
。 如果在拉动前git diff origin/master
,则应该对潜在的合并冲突有所了解,并可以相应地准备本地分支。
除了拉动和推入之外, 有些工作流程还涉及git rebase
,例如这一工作,我从链接文章中解释一下:
git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch
如果您发现自己处于这种情况,则可能会尝试git pull --rebase
。 除非您真的非常了解自己在做什么,否则我建议您不要这样做。 该警告来自git-pull
的man
页,版本2.3.5
:
这是潜在的危险操作模式。 它会重写历史记录,当您已经发布该历史记录时,这并不是一个好兆头。 除非您已仔细阅读git-rebase(1),否则不要使用此选项。
#30楼
当您使用
pull
,Git会尝试自动为您完成工作。 它是上下文相关的 ,因此Git会将所有提交的提交合并到您当前正在使用的分支中pull
自动合并提交,而无需您先对其进行审查 。 如果您不严密管理分支机构,则可能会遇到频繁的冲突。fetch
,Git会从目标分支中收集当前分支中不存在的所有提交,并将它们存储在本地存储库中 。 但是, 它不会将它们与当前分支合并 。 如果您需要使存储库保持最新状态,但是正在进行某些可能会在更新文件时中断的工作,则此功能特别有用。 要将提交集成到您的master分支中,请使用merge
。
#39;git pull#39;和#39;git fetch#39;有什么区别?相关推荐
- git pull origin master与git pull --rebase origin master的区别
建议:最好看一遍廖雪峰的git教程,看完时间差不多就两个小时,git相关的知识写的很清楚,看完整个人都豁然开朗,很多git的问题都想通了. 区别: git pull=git fetch + git m ...
- 本地没有任何修改,只是git pull时,显示git ahead of ‘origin/master‘ by * commits
目录 TL;DR 问题 原因 解决方案 TL;DR 本地没有更改,只是从远程pull,但是显示Your branch is ahead of 'origin/master' by 3 commits. ...
- git pull的理解 以及 git conflict的解决
git pull:相当于是从远程获取最新版本并merge到本地 即: git fetch -> 与本地的分支(比如master)merge 如果有conflict报错 1 先查看statue - ...
- git pull 报错:git - error: RPC failed; curl 18 transfer closed with outstanding read data remaining 解决
在git pull公司项目的时候,发现报错了.报错信息如下所示: 报错信息: fatal: The remote end hung up unexpectedly error: RPC failed; ...
- git pull 报错:git - error: RPC failed curl 18 transfer closed with outstanding read data remaining 解决
文章目录 1.美图 2.背景 4.配置缓冲区大小 5.查看配置 1.美图 2.背景 在git pull公司项目的时候,发现报错了.报错信息如下所示: 报错信息: fatal: The remote e ...
- git pull远程master_github与Git实用操作图解之一
1. git和github工具的联系 2. github创建Git 仓库 New repository -> repository name(仓库名称) ->Public(免费) -> ...
- 详解git pull和git fetch的区别:
前言 在我们使用git的时候用的更新代码是git fetch,git pull这两条指令.但是有没有小伙伴去思考过这两者的区别呢?有经验的人总是说最好用git fetch+git merge,不建议用 ...
- git提取和拉取的区别_git fetch和git pull的区别
[是什么]:平时开发经常遇到不清楚的问题就百度/google,目的是能快速使用并解决问题.这时我们没有花太多时间去深入理解,只求能快速解决手头问题. [为什么]但是如果要深入理解的话,发现有时候百度出 ...
- git fetch 与 git pull
文章目录 git flow 流程 git fetch 与 git pull 区别 git fetch 工作流程 git flow 流程 先来看一张图吧: 大致流程是这样的:我们在本地(工作区)编写好代 ...
最新文章
- eclipse常用设置之自动格式化
- mysql keepalived主主同步_KEEPALIVED+MYSQL主主同步=MYSQL高可用(HA)集群
- C++内联函数的学习
- C++语言基础 —— 控制结构
- 一个简单而强大的单片机内存管理器-不带内存碎片整理
- linux的ky3关闭防火墙,ky3-8
- 认识Blend 3工作区
- python自动控制库_python PyAUtoGUI库实现自动化控制鼠标键盘
- mysql st centroid_postgresql – ST_Distance的返回值单位
- oracle联机文档使用,Sqlplus 联机文档学习
- CSS的position属性
- 微信机器人框架【Python】
- 那智机器人工具坐标设置方法
- 非线性系统的神经网络控制(常用介绍)--理论
- 8081端口导致React Native启动失败
- 更深一步了解,电容是起什么作用的?
- 安装VS2008的时候Windows Mobile 5.0 SDK R2 for pocket pc错误解决方案
- bbedit php,BBEdit for Mac(最好用的HTML文本编辑器)
- lamport面包店算法详细讲解及代码实现
- python 梦幻西游_tensorflow实践:梦幻西游人物弹窗识别(二)