“git pull”和“git fetch”有什么区别?

谁践踏了优雅 2024-03-31 15:51 146阅读 0赞

问题描述:

想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

git pull 和 git fetch 有什么区别?

解决方案1:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

用最简单的术语来说,git pull 执行 git fetch 后跟 git merge。

git fetch 更新 refs/remotes// 下的远程跟踪分支。此操作可随时安全运行,因为它不会更改您在 refs/heads 下的任何本地分支。

git pull 使用其远程版本更新本地分支,同时更新您的其他远程跟踪分支。

来自 git pull 的 Git 文档:

在其默认模式下,git pull 是 git fetch 后跟 git merge FETCH_HEAD 的简写。

““git pull”是您将存储库更新到最新的方法”<- 存储库更新不是已经通过 fetch 完成了吗?您不是说它使您的本地分支机构与远程分支机构保持同步吗?到合并:它将远程分支与这些分支的本地副本合并,或者它在这里合并了什么?

@Albert:是的,它的措辞很奇怪。 git pull 将始终合并到当前分支。因此,您选择要从 拉取的分支,并将其拉入当前分支。 from 分支可以是本地的或远程的;它甚至可以是一个未注册的远程分支 git remote(意味着您在 git pull 命令行上传递一个 URL)。

@espertus:不。推送永远不会自动进行合并。用户应该在本地拉取,解决任何合并冲突,然后推回远程。

如果我在 /home/alice/ 并执行 git fetch /home/bob,我应该将哪些参数传递给后续的 git merge ?

学习 Git 的人请注意:pull 实际上不能用 fetch 加 merge 来模拟。我刚刚获取了一个只有远程分支指针更改的更改,并且 merge 拒绝执行任何操作。另一方面,pull 快进我的跟踪分支。

解决方案2:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

git pull 尝试在获取提交后自动合并。它是上下文敏感的,因此所有拉取的提交都将合并到您当前活动的分支中。 git pull 会自动合并提交,而无需您先查看它们。如果你不仔细管理你的分支,你可能会遇到频繁的冲突。

git fetch 从目标分支收集当前分支中不存在的所有提交,并将它们存储在本地存储库中。但是,它不会将它们与您当前的分支合并。如果您需要使存储库保持最新状态,但正在处理可能会因更新文件而中断的事情,这将特别有用。要将提交集成到您当前的分支中,您必须在之后使用 git merge 。

同意,很棒的评论。这就是我讨厌 git pull 的原因。什么时候让修订工具为您进行代码编辑才有意义?这不是合并两个文件的作用吗?如果这两个编辑在文件中物理上是分开的,但逻辑上不一致怎么办?

我不确定我是否理解正确。如果我是对的,请告诉我:假设我有两个分支,master 和 test。 test 是我正在研究的一个分支。如果我执行 git fetch,它会使用目标分支更新 master。如果我执行 git pull,它会尝试使用目标分支更新测试。这是正确的吗?如果不是,我想我不明白“本地存储库”是什么意思——我认为这意味着我的本地主人。

@elexhobby 简而言之,git fetch 仅更新您的 .git/ 目录(AKA:本地存储库),而在 .git/ 之外没有任何内容(AKA:工作树)。它不会更改您的本地分支,也不会触及 master。它触及 remotes/origin/master(见 git branch -avv)。如果您有更多遥控器,请尝试 git remote update。这是一个命令中所有遥控器的 git fetch。

@Tino 你的确实是最重要的一点。人们可能不知道“远程”分支实际上存储为 .git/refs/remotes/origin/ 中的一堆哈希。

因此,fetch 命令类似于“从远程提交到本地”。正确的?

解决方案3:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

将 git 的设计理念与更传统的源代码控制工具(如 SVN)的理念进行对比非常重要。

Subversion 是使用客户端/服务器模型设计和构建的。有一个存储库是服务器,多个客户端可以从服务器获取代码,对其进行处理,然后将其提交回服务器。假设客户端在需要执行操作时始终可以联系服务器。

Git 旨在支持更分布式的模型,而不需要中央存储库(尽管您当然可以根据需要使用一个)。 git 也被设计成客户端和“服务器”不需要同时在线。 Git 的设计目的是让不可靠链接上的人们甚至可以通过电子邮件交换代码。可以完全断开连接并刻录 CD 以通过 git 交换代码。

为了支持这个模型,git 使用你的代码维护一个本地存储库,以及一个反映远程存储库状态的附加本地存储库。通过在本地保存远程存储库的副本,即使远程存储库无法访问,git 也可以找出所需的更改。稍后当您需要将更改发送给其他人时,git 可以将它们作为一组更改从已知的时间点传输到远程存储库。

git fetch 是说“使我的远程存储库的本地副本保持最新”的命令。

git pull 说“将远程存储库中的更改带到我保存自己代码的地方。”

通常,git pull 通过执行 git fetch 来更新远程存储库的本地副本,然后将更改合并到您自己的代码存储库和可能是你的工作副本。

需要记住的是,您的工作站上通常至少有三个项目副本。一个副本是您自己的存储库,其中包含您自己的提交历史记录。第二个副本是您正在编辑和构建的工作副本。第三个副本是远程存储库的本地“缓存”副本。

从技术上讲,本地和远程存储库实际上是一回事。在 Git 中,存储库是指向其父级的提交的 DAG。从技术上讲,分支只不过是有意义的提交名称。本地分支和远程分支的唯一区别是远程分支以 remoteName/ 为前缀,Git from the ground up 非常好读。一旦你了解了 Git 的工作原理——它真的很简单——一切都变得有意义了。

错误的。存储库不包含工作树的副本。存储库是更改列表。因此,除非您明确 cp -R 它,否则工作站上只有一个项目实例。

解决方案4:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

这是Oliver Steele’s image of how all it all fits together:

https://i.stack.imgur.com/XwVzT.png

带有 git clone 和 git merge 的更新图像会很有帮助!

是的,请添加 git merge - 它应该清楚地表明单独调用的 merge 与调用 pull 不同,因为 pull 仅从远程合并并忽略您在跟踪远程的本地分支中的本地提交被拉出的分支。

一张图片胜过千言万语!带有克隆和合并数据流的更新图像是否在某处准备就绪?除了图中已有的数据流之外,还有其他数据流吗?

解决方案5:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

git fetch 的一个用例是,以下内容将告诉您自上次拉取以来远程分支中的任何更改…因此您可以在进行实际拉取之前进行检查,这可能会更改当前分支和工作副本中的文件。

  1. git fetch
  2. git diff ...origin

请参阅有关双 … 和三点 … 语法的 git diff 文档。

解决方案6:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

我花了一点时间来理解有什么区别,但这是一个简单的解释。 master 在您的本地主机中是一个分支。

克隆存储库时,您会将整个存储库获取到本地主机。这意味着当时您有一个指向 HEAD 的 origin/master 指针和指向同一个 HEAD 的 master。

当您开始工作并提交时,您将主指针前进到 HEAD + 您的提交。但是原点/主指针仍然指向克隆时的位置。

所以区别将是:

如果您执行 git fetch,它只会获取远程存储库 (GitHub) 中的所有更改并将源/主指针移动到 HEAD。同时,您的本地分支主管将继续指向它所在的位置。

如果您执行 git pull,它基本上会执行 fetch(如前所述)并将任何新更改合并到您的 master 分支并将指针移动到 HEAD。

origin/master 是一个本地分支,它是原点上 master 的副本。当您获取时,您会更新 local:/origin/master。一旦你真正理解 git 中的所有东西都是一个分支,这很有意义,并且是一种非常强大的方式来维护不同的变更集,快速创建本地分支,合并和变基,并且通常从廉价的分支中获得很多价值模型。

解决方案7:

huntsbot.com – 高效赚钱,自由工作

有时,视觉表示会有所帮助。

https://i.stack.imgur.com/ZYAVG.jpg

我认为这张照片必须表明它也影响了本地回购。也就是说,Git pull 是影响本地 repo 和工作副本的组合。现在它似乎只影响工作副本。

解决方案8:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

更简短的

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 将准确地向您展示所有分支(本地和远程)的情况。

这篇博文很有用:

The difference between git pull, git fetch and git clone (and git rebase) - Mike Pearce

并涵盖 git pull、git fetch、git clone 和 git rebase。

更新

我想我会更新这个来展示你在实践中是如何使用它的。

从远程更新您的本地仓库(但不要合并): git fetch 下载更新后,让我们看看差异: git diff master origin/master 如果您对这些更新感到满意,则合并: git pull

笔记:

第 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/

另请注意:我在 pull 中提到了 merge,但是您可以将 pull 配置为使用 rebase。

下面是一个非常重要的更新下载更新后,让我们看看差异:'git diff master origin/master'

解决方案9:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

  1. git-pull - Fetch from and merge with another repository or a local branch
  2. SYNOPSIS
  3. git pull
  4. DESCRIPTION
  5. Runs git-fetch with the given parameters, and calls git-merge to merge the
  6. retrieved head(s) into the current branch. With --rebase, calls git-rebase
  7. instead of git-merge.
  8. Note that you can use . (current directory) as the to pull
  9. from the local repository this is useful when merging local branches
  10. into the current branch.
  11. Also note that options meant for git-pull itself and underlying git-merge
  12. must be given before the options meant for git-fetch.

如果你想合并历史,你会拉,如果你只是“想要 codez”,你会提取,因为有人在这里标记了一些文章。

解决方案10:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

好的,这里有一些关于git pull和git fetch的信息,所以你可以了解实际的区别…简单的几句话,fetch获取最新数据,但不是代码更改,也不会弄乱您当前的本地分支代码,但 pull 获取代码更改并将其合并到您的本地分支,继续阅读以获取有关每个分支的更多详细信息:

获取

它将所有引用和对象以及任何新分支下载到您的本地存储库…

从一个或多个其他存储库中获取分支和/或标签(统称为“引用”),以及完成其历史所需的对象。远程跟踪分支已更新(有关控制此行为的方法,请参见下面的描述)。默认情况下,任何指向正在获取的历史的标签也会被获取;效果是获取指向您感兴趣的分支的标签。可以通过使用 —tags 或 —no-tags 选项或配置 remote…tagOpt 来更改此默认行为。通过使用显式获取标签的 refspec,您也可以获取不指向您感兴趣的分支的标签。 git fetch 可以从单个命名存储库或 URL 或从多个存储库中获取,如果给定并且有一个遥控器。配置文件中的条目。 (参见 git-config1)。如果未指定远程,默认情况下将使用原始远程,除非为当前分支配置了上游分支。获取的 ref 的名称以及它们指向的对象名称被写入 .git/FETCH_HEAD。脚本或其他 git 命令(例如 git-pull)可能会使用此信息。

git 拉

它会将远程的更改应用到本地的当前分支…

将来自远程存储库的更改合并到当前分支中。在其默认模式下,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/),但通常是名称远程存储库中的一个分支。和 的默认值是从 git-branch —track 设置的当前分支的“远程”和“合并”配置中读取的。

我还创建了下面的视觉效果,向您展示 git fetch 和 git pull 如何协同工作…

https://i.stack.imgur.com/nWYnQ.png

解决方案11:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

您可以从远程存储库中获取,查看差异,然后提取或合并。

这是一个名为 origin 的远程存储库和一个名为 master 的分支跟踪远程分支 origin/master 的示例:

  1. git checkout master
  2. git fetch
  3. git diff origin/master
  4. git rebase origin master

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

由于您已经获取了更改,因此您可能希望跳过拉取并仅执行“git rebase origin”作为最后一步。原因是有人可能会在您进行 fetch 之后的时间内推送更改,而这些不会在您进行差异审查的 fetch 中。

原文链接:https://www.huntsbot.com/qa/EVmw/what-is-the-difference-between-git-pull-and-git-fetch?lang=zh_CN

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

发表评论

表情:
评论列表 (有 0 条评论,146人围观)

还没有评论,来说两句吧...

相关阅读