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.
获取遥控器镜像的一些主要优点是:
Performance (滚动浏览所有提交和消息,而不是试图通过网络挤压它)
Feedback 关于本地仓库的状态(例如,我使用Atlassian 's SourceTree, which will give me a bulb indicating if I' m提交比原点提前或落后 . 可以使用GIT FETCH更新此信息) .
git-pull - Fetch from and merge with another repository or a local branch
SYNOPSIS
git pull …
DESCRIPTION
Runs 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.
当您使用 pull 时,Git会尝试自动为您完成工作 . It is context sensitive ,因此Git会将任何提取的提交合并到您当前正在处理的分支中. pullautomatically merges the commits without letting you review them first . 如果您不密切管理您的分支机构,您可能会遇到频繁的冲突 .
当你 fetch 时,Git会收集目标分支中当前分支中不存在的任何提交和 stores them in your local repository . 但是, it does not merge them with your current branch . 如果您需要使您的存储库保持最新,但是在更新文件时正在处理可能会中断的事情,这将非常有用 . 要将提交集成到主分支中,请使用 merge .
请注意 git pull 将 automatically merge whether you like it or not 非常重要 . 当然,这可能导致合并冲突 . 假设你的遥控器是 origin 而你的分支是 master . 如果你在拉动之前,你应该知道潜在的合并冲突,并可以相应地准备你的本地分支 .
30 回答
git pull ==(git fetch git merge)
git fetch不会更改为本地分支 .
如果您已经有一个本地存储库,其中包含为所需项目设置的远程数据库,则可以使用git fetch获取现有远程数据库的所有分支和标记 . ... Fetch不会对本地分支进行任何更改,因此您需要将远程分支与配对的本地分支合并以合并新的提取更改 . from github
我们简单地说:
如果运行
git pull
,则无需将数据合并到本地 . 如果运行git fetch
,则表示必须运行git merge
才能获取本地计算机的最新代码 . 否则,如果没有合并,则不会更改本地机器代码 .所以在Git Gui中,当你进行提取时,你必须合并数据 . 获取本身不会使您的本地代码更改 . 您可以通过提取一次并查看更新代码来检查;它不会改变的代码 . 然后你合并......你会看到更改后的代码 .
Git使用两个命令从远程到本地获取最新版本的分支:
git fetch origin master
git log -p master..origin/master
git merge origin/master
上述命令意味着从远程到原始主分支的原点下载最新版本的主分支 . 然后比较本地主分支和原始主分支 . 最后,合并 .
git pull origin master
上面的命令相当于
git fetch
和git merge
. 在实践中,git fetch
可能更安全,因为在合并之前我们可以看到更改并决定是否合并 .我喜欢用一些视觉表现来掌握这些东西 . 也许其他开发者也希望看到它,所以这是我的补充 . 我不完全确定这一切都是正确的,所以如果你发现任何错误请发表评论 .
获取遥控器镜像的一些主要优点是:
Performance (滚动浏览所有提交和消息,而不是试图通过网络挤压它)
Feedback 关于本地仓库的状态(例如,我使用Atlassian 's SourceTree, which will give me a bulb indicating if I' m提交比原点提前或落后 . 可以使用GIT FETCH更新此信息) .
git fetch
的一个用例是,以下将告诉您自上次拉动以来远程分支中的任何更改...因此您可以在执行实际拉动之前进行检查,这可能会更改当前分支和工作副本中的文件 .您可以从远程存储库中获取,查看差异,然后拉取或合并 .
这是一个名为
origin
的远程存储库和一个名为master
的分支跟踪远程分支origin/master
的示例:实际上Git维护着您自己的代码和远程存储库的副本 .
命令
git fetch
通过从远程存储库获取数据使您的本地副本保持最新 . 我们需要这个的原因是因为其他人可能对代码进行了一些更改,并且您希望自己更新 .命令
git pull
将远程存储库中的更改带到您保留自己的代码的位置 . 通常,git pull
首先通过执行'git fetch'来使远程存储库的本地副本更新,然后将更改合并到您自己的代码存储库以及可能的工作副本中 .git fetch
将代码从远程服务器下拉到本地存储库中的跟踪分支 . 如果您的遥控器名为origin
(默认值),则这些分支将在origin/
内,例如origin/master
,origin/mybranch-123
等 . 这些不是您当前的分支,它们是来自服务器的那些分支的本地副本 .git pull
执行git fetch
但随后 also 将跟踪分支中的代码合并到该分支的当前本地版本中 . 如果你尚未准备好进行更改,请先git fetch
.我也在努力解决这个问题 . 事实上,我在谷歌搜索完全相同的问题 . 阅读所有这些答案终于在我脑海中画了一幅画,我决定尝试着看看2个存储库和1个沙盒的状态以及随着时间的推移在观看它们的版本时执行的操作 . 所以这就是我想出来的 . 如果我搞砸了,请纠正我 .
三个回购与取:
拉三个回购
这有助于我理解为什么抓取非常重要 .
这个交互式图形表示非常有助于git:http://ndpsoftware.com/git-cheatsheet.html
git fetch
只是"downloads"从远程到本地存储库的更改 .git pull
下载更改并将它们合并到当前分支中 . “在默认模式下,git pull
是git fetch
的简写,后跟git merge FETCH_HEAD
. ”这是Oliver Steele's image of how all it all fits together:
如果有足够的兴趣,我想我可以更新图像以添加
git clone
和git merge
...有时,视觉表现有帮助 .
OK ,这里有一些关于
git pull
和git fetch
的信息,所以你可以理解实际的差异......用简单的几句话来说, fetch 获取最新数据,但不是代码更改,也不会弄乱你当前的本地分支代码,但是 pull 获取代码更改并将其合并到您的本地分支,继续阅读以获取有关每个分支的更多详细信息:git fetch
它会将所有 refs 和 objects 以及任何新分支下载到本地存储库...
git pull
它会将 remote 中的更改应用到本地的 current branch ...
我还在下面创建 visual ,向您展示
git fetch
和git pull
如何一起工作......如果您想要合并历史记录,您可以选择,如果您只是想要“codez”,则可以获取,因为某些人已在此处标记了一些文章 .
当您使用
pull
时,Git会尝试自动为您完成工作 . It is context sensitive ,因此Git会将任何提取的提交合并到您当前正在处理的分支中.pull
automatically merges the commits without letting you review them first . 如果您不密切管理您的分支机构,您可能会遇到频繁的冲突 .当你
fetch
时,Git会收集目标分支中当前分支中不存在的任何提交和 stores them in your local repository . 但是, it does not merge them with your current branch . 如果您需要使您的存储库保持最新,但是在更新文件时正在处理可能会中断的事情,这将非常有用 . 要将提交集成到主分支中,请使用merge
.一个简单的初学者图形表示,
这里,
将使用您的本地从存储库和rebase获取代码...在git pull中可能会创建新的提交 .
但在 ,
git fetch
将从存储库中获取代码,我们需要使用
git rebase
手动重新绑定它例如:我将从服务器主服务器获取并在我的本地主服务器中重新绑定它 .
1)git pull(rebase将自动完成):
这里 origin 是你的远程回购 master 是你的分支
2)git fetch(需要手动rebase):
它将从源获取服务器更改 . 它将在你的本地,直到你自己改变它 . 我们需要通过检查代码手动修复冲突 .
这会将代码重新绑定到本地 . 在那之前确保你在正确的分支 .
简短的回答是
git pull
只是git fetch
紧随其后git merge
.请注意
git pull
将 automatically merge whether you like it or not 非常重要 . 当然,这可能导致合并冲突 . 假设你的遥控器是origin
而你的分支是master
. 如果你在拉动之前,你应该知道潜在的合并冲突,并可以相应地准备你的本地分支 .除了拉动和推动之外,some workflows涉及
git rebase
,例如这个,我从链接的文章中解释:如果你发现自己处于这样的境地,你可能会想到
git pull --rebase
. 除非你真的,真的知道你在做什么,否则我会反对 . 此警告来自git-pull
页面git-pull
,版本2.3.5
:将git的设计理念与更传统的源控制工具(如SVN)的理念进行对比非常重要 .
Subversion是使用客户端/服务器模型设计和构建的 . 有一个存储库是服务器,几个客户端可以从服务器获取代码,对其进行处理,然后将其提交回服务器 . 假设客户端可以在需要执行操作时始终联系服务器 .
Git旨在支持更加分散的模型而不需要中央存储库(尽管如果您愿意,您当然可以使用它) . 此外,git的设计使客户端和“服务器”不需要同时在线 . Git的设计使得不可靠链接的人们甚至可以通过电子邮件交换代码 . 可以完全断开连接并刻录CD以通过git交换代码 .
为了支持这个模型,git使用您的代码维护一个本地存储库,还有一个镜像远程存储库状态的附加本地存储库 . 通过在本地保留远程存储库的副本,即使无法访问远程存储库,git也可以找出所需的更改 . 稍后当您需要将更改发送给其他人时,git可以将它们作为一组更改从远程存储库已知的时间点进行传输 .
git fetch 是说"bring my local copy of the remote repository up to date."的命令
git pull 说"bring the changes in the remote repository to where I keep my own code."
通常 git pull 通过执行 git fetch 来更新远程存储库的本地副本,然后将更改合并到您自己的代码存储库以及可能的工作副本中 .
需要注意的是,工作站上通常至少有一个项目.327143_ . 一个副本是您自己的存储库,具有您自己的提交历史记第二个副本是您正在编辑和构建的工作副本 . 第三个副本是远程存储库的本地"cached"副本 .
Git Fetch
您可以通过提取将更改从源下载到本地分支 . Fetch向远程仓库询问其他人已经提交的所有提交但您没有本地仓库的提交 . Fetch下载这些提交并将它们添加到本地存储库 .
Git Merge
您可以使用merge命令应用通过fetch下载的更改 . Merge将获取从fetch中检索的提交,并尝试将它们添加到本地分支 . 合并将保留本地更改的提交历史记录,以便当您使用push共享分支时,Git将知道其他人如何合并您的更改 .
Git Pull
获取和合并运行得足够频繁,以便创建一个组合了两个pull的命令 . Pull执行获取然后合并以将下载的提交添加到本地分支 .
git pull
和git fetch
之间的唯一区别是:git pull
从远程分支拉出并合并它 .git fetch
仅从远程分支获取但不合并即git pull = git fetch git merge ...
Git允许在较新的提交后应用按时间顺序排列的旧提交 . 因此,在存储库之间传输提交的操作分为两个步骤:
(回购回购业务)
[email protected] >> remote/origin/[email protected]
(内部回购操作)
remote/origin/[email protected] >> [email protected]
有两种方法可以执行第2步 . 您可以:
在最后一个共同祖先之后的fork本地分支,并添加与本地存储库唯一的提交并行的新提交,通过合并提交,关闭fork来最终确定 .
在最后一个共同祖先之后插入新提交并重新应用对本地存储库唯一的提交 .
在
git
术语中,步骤1是git fetch
,步骤2是git merge
或git rebase
git pull
是git fetch
和git merge
要理解这一点,首先需要了解本地git不仅维护本地存储库,还维护远程存储库的本地副本 .
git fetch
使您的远程存储库的本地副本保持最新 . 例如,如果您的远程存储库是GitHub - 您可能希望将远程存储库中所做的任何更改提取到远程存储库的本地副本 . 这将允许您执行比较或合并等操作 .另一方面,
git pull
会将远程存储库中的更改记录到您保留自己的代码的位置 . 通常,git pull
将首先执行git fetch
以使远程存储库的本地副本保持最新,然后它将更改合并到您自己的代码存储库以及可能的工作副本中 .GIT Fetch 和 GIT Pull 之间的区别可以通过以下场景来解释:(记住图片比单词更响亮!,我提供了图形表示)
让我们举一个例子,说明您正在与团队成员一起开展项目 . 所以他们将成为项目的一个主要分支,所有贡献者必须将它分叉到他们自己的本地存储库,然后在这个本地分支上工作以修改/添加模块然后推回到主分支 .
因此,当您在本地存储库中分叉主项目时,两个分支中的 Initial State 将是这样的 - (
A
,B
和C
是已完成项目的模块)现在,您已经开始处理新模块(假设
D
),当您完成D
模块时,您想将其推送到主分支,但同时发生的情况是您的一个团队成员开发了新的模块E
,_F
和修改C
.所以现在发生的事情是您的本地存储库缺乏项目的原始进度,因此将更改推送到主分支可能会导致冲突并可能导致您的模块出现故障 .
为避免此类问题并与项目的原始进度并行工作,他们有两种方式:
1. Git Fetch- 这将下载对原始/主分支项目所做的所有更改,这些更改在本地分支中不存在 . 并将等待Git Merge命令将已提取的更改应用于您的存储库或分支 .
所以现在您可以在将文件合并到存储库之前仔细监视这些文件 . 如果需要,您还可以修改
D
,因为修改了C
.2. Git Pull- 这将使用origin / main分支更新本地分支,即实际上它的作用是Git Fetch和Git的组合一个接一个地合并 . 但这可能会导致冲突发生,因此建议使用Git Pull和干净的副本 .
Briefly
git fetch
类似于pull
但不合并 . 即它获取远程更新(refs
和objects
)但您的本地保持不变(即origin/master
更新但master
保持不变) .git pull
从遥控器下拉并立即合并 .More
git clone
克隆了一个回购 .git rebase
将当前分支中不在上游分支中的内容保存到临时区域 . 您的分支现在与开始更改之前的分支相同 . 因此,git pull -rebase
将下拉远程更改,回退本地分支,在您当前分支的顶部重播您的更改,直到您获得最新信息 .此外,
git branch -a
将向您显示所有分支机构的确切情况 - 本地和远程 .这篇博文很有用:
The difference between git pull, git fetch and git clone (and git rebase) - Mike Pearce
并涵盖
git pull
,git fetch
,git clone
和git rebase
.====
UPDATE
我想我会更新这个以显示你在实践中如何实际使用它 .
笔记:
在第2步:有关本地和遥控器之间差异的更多信息,请参阅:How to compare a local git branch with its remote branch?
在第3步:在这里做一个
git rebase origin
可能更准确(例如在快速变化的回购中) . 请参阅另一个答案中的@Justin Ohms comment .另见:http://longair.net/blog/2009/04/16/git-fetch-and-merge/
git fetch
将检索远程分支,以便您可以使用当前分支git diff
或git merge
它们 .git pull
将在当前分支跟踪的远程brach上运行fetch,然后合并结果 . 您可以使用git fetch
查看远程分支是否有任何更新,而无需将它们与本地分支合并 .奖金:
在谈到上述答案中的提取和提取时,我想分享一个有趣的技巧,
git pull --rebase
上面的命令是我git生活中最有用的命令,节省了大量的时间 .
在将新提交推送到服务器之前,请尝试此命令,它将自动同步最新的服务器更改(使用提取合并),并将您的提交放在git log中的顶部 . 无需担心手动拉/合并 .
查找详细信息:http://gitolite.com/git-pull--rebase
我花了一点时间来理解有什么区别,但是这个是一个简单的解释 . 您的localhost中的
master
是一个分支 .克隆存储库时,将整个存储库提取到本地主机 . 这意味着那时你有一个指向
HEAD
的origin / master指针和指向同一HEAD
的master .当你开始工作并做提交时,你将主指针前进到
HEAD
你的提交 . 但是,原始/主指针仍指向克隆时的内容 .所以区别在于:
如果执行
git fetch
,它将只获取远程存储库中的所有更改(GitHub)并将原点/主指针移动到HEAD
. 与此同时,您当地的分公司主人将继续指向它所在的位置 .如果执行
git pull
,它将基本上进行提取(如前所述)并将任何新更改合并到主分支并将指针移动到HEAD
.试图清晰简单 .
对于 git fetch , git pull 命令实际上是
shortcut
,后跟 git merge 或 git rebase 命令,具体取决于您的配置 . 您可以配置Git存储库,以便 git pull 是一个fetch,后跟一个rebase .用最简单的术语来说,
git pull
的git fetch
后跟git merge
.您可以随时
git fetch
更新refs/remotes/<remote>/
下的远程跟踪分支 .此操作永远不会更改
refs/heads
下的任何本地分支,并且可以安全地执行此操作而无需更改工作副本 . 我甚至听说有人在后台的cron作业中定期运行git fetch
(虽然我不建议这样做) .使用
git pull
可以使本地分支与其远程版本保持同步,同时还可以更新其他远程跟踪分支 .Git文档:git pull