首页 文章

'git pull'和'git fetch'之间有什么区别?

提问于
浏览 1263
10549

主持人注意:鉴于此问题已经发布了67个答案(其中一些已删除),请考虑在发布另一个问题之前是否提供任何新内容 .

git pullgit fetch 之间有什么区别?

30 回答

  • 8792

    试图清晰简单 .

    对于 git fetchgit pull 命令实际上是 shortcut ,后跟 git mergegit rebase 命令,具体取决于您的配置 . 您可以配置Git存储库,以便 git pull 是一个fetch,后跟一个rebase .

  • 1930

    我也在努力解决这个问题 . 事实上,我在谷歌搜索完全相同的问题 . 阅读所有这些答案终于在我脑海中画了一幅画,我决定尝试着看看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+               -
    ---------------------     -----------------------     -----------------------
    

    这有助于我理解为什么抓取非常重要 .

  • 1074

    Git允许在较新的提交后应用按时间顺序排列的旧提交 . 因此,在存储库之间传输提交的操作分为两个步骤:

    • 将新提交从远程分支复制到本地存储库中的此远程分支的副本 .

    (回购回购业务) master@remote >> remote/origin/master@local

    • 将新提交集成到本地分支

    (内部回购操作) remote/origin/master@local >> master@local

    有两种方法可以执行第2步 . 您可以:

    • 在最后一个共同祖先之后的fork本地分支,并添加与本地存储库唯一的提交并行的新提交,通过合并提交,关闭fork来最终确定 .

    • 在最后一个共同祖先之后插入新提交并重新应用对本地存储库唯一的提交 .

    git 术语中,步骤1是 git fetch ,步骤2是 git mergegit rebase

    git pullgit fetchgit merge

  • 713
    • 当您使用 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 .

  • 438

    git fetch 将检索远程分支,以便您可以使用当前分支 git diffgit merge 它们 . git pull 将在当前分支跟踪的远程brach上运行fetch,然后合并结果 . 您可以使用 git fetch 查看远程分支是否有任何更新,而无需将它们与本地分支合并 .

  • 347

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

    git fetch
    git diff ...origin
    
  • 190

    我们简单地说:

    git pull == git fetch + git merge
    

    如果运行 git pull ,则无需将数据合并到本地 . 如果运行 git fetch ,则表示必须运行 git merge 才能获取本地计算机的最新代码 . 否则,如果没有合并,则不会更改本地机器代码 .

    所以在Git Gui中,当你进行提取时,你必须合并数据 . 获取本身不会使您的本地代码更改 . 您可以通过提取一次并查看更新代码来检查;它不会改变的代码 . 然后你合并......你会看到更改后的代码 .

  • 172

    git pull ==(git fetch git merge)

    git fetch不会更改为本地分支 .

    如果您已经有一个本地存储库,其中包含为所需项目设置的远程数据库,则可以使用git fetch获取现有远程数据库的所有分支和标记 . ... Fetch不会对本地分支进行任何更改,因此您需要将远程分支与配对的本地分支合并以合并新的提取更改 . from github

  • 161

    将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"副本 .

  • 147

    git pull和git fetch有什么区别?

    要理解这一点,首先需要了解本地git不仅维护本地存储库,还维护远程存储库的本地副本 .

    git fetch 使您的远程存储库的本地副本保持最新 . 例如,如果您的远程存储库是GitHub - 您可能希望将远程存储库中所做的任何更改提取到远程存储库的本地副本 . 这将允许您执行比较或合并等操作 .

    另一方面, git pull 会将远程存储库中的更改记录到您保留自己的代码的位置 . 通常, git pull 将首先执行 git fetch 以使远程存储库的本地副本保持最新,然后它将更改合并到您自己的代码存储库以及可能的工作副本中 .

  • 140

    奖金:

    在谈到上述答案中的提取和提取时,我想分享一个有趣的技巧,

    git pull --rebase

    上面的命令是我git生活中最有用的命令,节省了大量的时间 .

    在将新提交推送到服务器之前,请尝试此命令,它将自动同步最新的服务器更改(使用提取合并),并将您的提交放在git log中的顶部 . 无需担心手动拉/合并 .

    查找详细信息:http://gitolite.com/git-pull--rebase

  • 117

    简短的回答是 git pull 只是 git fetch 紧随其后 git merge .

    请注意 git pullautomatically merge whether you like it or not 非常重要 . 当然,这可能导致合并冲突 . 假设你的遥控器是 origin 而你的分支是 master . 如果你在拉动之前,你应该知道潜在的合并冲突,并可以相应地准备你的本地分支 .

    除了拉动和推动之外,some workflows涉及 git rebase ,例如这个,我从链接的文章中解释:

    git pull origin master
    git checkout foo-branch
    git rebase master
    git push origin foo-branch
    

    如果你发现自己处于这样的境地,你可能会想到 git pull --rebase . 除非你真的,真的知道你在做什么,否则我会反对 . 此警告来自 git-pull 页面 git-pull ,版本 2.3.5

    这是一种潜在的危险操作模式 . 它重写了历史,当你已经发布了这段历史时,它并不是一个好兆头 . 除非您仔细阅读git-rebase(1),否则请勿使用此选项 .

  • 115

    git pullgit fetch 之间的唯一区别是:

    git pull 从远程分支拉出并合并它 .

    git fetch 仅从远程分支获取但不合并

    即git pull = git fetch git merge ...

  • 113

    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 fetchgit merge . 在实践中, git fetch 可能更安全,因为在合并之前我们可以看到更改并决定是否合并 .

  • 107

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

    git fetch

    它会将所有 refsobjects 以及任何新分支下载到本地存储库...

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


    git pull

    它会将 remote 中的更改应用到本地的 current branch ...

    将来自远程存储库的更改合并到当前分支中 . 在默认模式下,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设置的当前分支的“远程”和“合并”配置中读取和的默认值 .


    我还在下面创建 visual ,向您展示 git fetchgit pull 如何一起工作......

    git pull and git fetch

  • 95
    git pull = git fetch + git merge
    
  • 87

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

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

    git checkout master                                                  
    git fetch                                        
    git diff origin/master
    git rebase origin master
    
  • 80

    我喜欢用一些视觉表现来掌握这些东西 . 也许其他开发者也希望看到它,所以这是我的补充 . 我不完全确定这一切都是正确的,所以如果你发现任何错误请发表评论 .

    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更新此信息) .

  • 77

    GIT FetchGIT Pull 之间的区别可以通过以下场景来解释:(记住图片比单词更响亮!,我提供了图形表示)

    让我们举一个例子,说明您正在与团队成员一起开展项目 . 所以他们将成为项目的一个主要分支,所有贡献者必须将它分叉到他们自己的本地存储库,然后在这个本地分支上工作以修改/添加模块然后推回到主分支 .

    因此,当您在本地存储库中分叉主项目时,两个分支中的 Initial State 将是这样的 - ( ABC 是已完成项目的模块)

    enter image description here

    现在,您已经开始处理新模块(假设 D ),当您完成 D 模块时,您想将其推送到主分支,但同时发生的情况是您的一个团队成员开发了新的模块 E ,_ F 和修改 C .
    所以现在发生的事情是您的本地存储库缺乏项目的原始进度,因此将更改推送到主分支可能会导致冲突并可能导致您的模块出现故障 .

    enter image description here

    为避免此类问题并与项目的原始进度并行工作,他们有两种方式:

    1. Git Fetch- 这将下载对原始/主分支项目所做的所有更改,这些更改在本地分支中不存在 . 并将等待Git Merge命令将已提取的更改应用于您的存储库或分支 .

    enter image description here

    所以现在您可以在将文件合并到存储库之前仔细监视这些文件 . 如果需要,您还可以修改 D ,因为修改了 C .

    enter image description here

    2. Git Pull- 这将使用origin / main分支更新本地分支,即实际上它的作用是Git Fetch和Git的组合一个接一个地合并 . 但这可能会导致冲突发生,因此建议使用Git Pull和干净的副本 .

    enter image description here

  • 73

    Briefly

    git fetch 类似于 pull 但不合并 . 即它获取远程更新( refsobjects )但您的本地保持不变(即 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 pullgit fetchgit clonegit rebase .

    ====

    UPDATE

    我想我会更新这个以显示你在实践中如何实际使用它 .

    • 从远程更新本地仓库(但不要合并):
    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/

  • 69

    实际上Git维护着您自己的代码和远程存储库的副本 .

    命令 git fetch 通过从远程存储库获取数据使您的本地副本保持最新 . 我们需要这个的原因是因为其他人可能对代码进行了一些更改,并且您希望自己更新 .

    命令 git pull 将远程存储库中的更改带到您保留自己的代码的位置 . 通常, git pull 首先通过执行'git fetch'来使远程存储库的本地副本更新,然后将更改合并到您自己的代码存储库以及可能的工作副本中 .

  • 47

    有时,视觉表现有帮助 .

    enter image description here

  • 42

    enter image description here

    这个交互式图形表示非常有助于git:http://ndpsoftware.com/git-cheatsheet.html

    git fetch 只是"downloads"从远程到本地存储库的更改 . git pull 下载更改并将它们合并到当前分支中 . “在默认模式下, git pullgit fetch 的简写,后跟 git merge FETCH_HEAD . ”

  • 35
    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.
    

    如果您想要合并历史记录,您可以选择,如果您只是想要“codez”,则可以获取,因为某些人已在此处标记了一些文章 .

  • 33

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

    enter image description here

    如果有足够的兴趣,我想我可以更新图像以添加 git clonegit merge ...

  • 31

    git fetch 将代码从远程服务器下拉到本地存储库中的跟踪分支 . 如果您的遥控器名为 origin (默认值),则这些分支将在 origin/ 内,例如 origin/masterorigin/mybranch-123 等 . 这些不是您当前的分支,它们是来自服务器的那些分支的本地副本 .

    git pull 执行 git fetch 但随后 also 将跟踪分支中的代码合并到该分支的当前本地版本中 . 如果你尚未准备好进行更改,请先 git fetch .

  • 30

    Git Fetch

    您可以通过提取将更改从源下载到本地分支 . Fetch向远程仓库询问其他人已经提交的所有提交但您没有本地仓库的提交 . Fetch下载这些提交并将它们添加到本地存储库 .

    Git Merge

    您可以使用merge命令应用通过fetch下载的更改 . Merge将获取从fetch中检索的提交,并尝试将它们添加到本地分支 . 合并将保留本地更改的提交历史记录,以便当您使用push共享分支时,Git将知道其他人如何合并您的更改 .

    Git Pull

    获取和合并运行得足够频繁,以便创建一个组合了两个pull的命令 . Pull执行获取然后合并以将下载的提交添加到本地分支 .

  • 30

    我花了一点时间来理解有什么区别,但是这个是一个简单的解释 . 您的localhost中的 master 是一个分支 .

    克隆存储库时,将整个存储库提取到本地主机 . 这意味着那时你有一个指向 HEAD 的origin / master指针和指向同一 HEAD 的master .

    当你开始工作并做提交时,你将主指针前进到 HEAD 你的提交 . 但是,原始/主指针仍指向克隆时的内容 .

    所以区别在于:

    • 如果执行 git fetch ,它将只获取远程存储库中的所有更改(GitHub)并将原点/主指针移动到 HEAD . 与此同时,您当地的分公司主人将继续指向它所在的位置 .

    • 如果执行 git pull ,它将基本上进行提取(如前所述)并将任何新更改合并到主分支并将指针移动到 HEAD .

  • 28

    一个简单的初学者图形表示,

    enter image description here

    这里,

    git pull
    

    将使用您的本地从存储库和rebase获取代码...在git pull中可能会创建新的提交 .

    但在 ,

    git fetch

    将从存储库中获取代码,我们需要使用 git rebase 手动重新绑定它

    例如:我将从服务器主服务器获取并在我的本地主服务器中重新绑定它 .

    1)git pull(rebase将自动完成):

    git pull origin master
    

    这里 origin 是你的远程回购 master 是你的分支

    2)git fetch(需要手动rebase):

    git fetch origin master
    

    它将从源获取服务器更改 . 它将在你的本地,直到你自己改变它 . 我们需要通过检查代码手动修复冲突 .

    git rebase origin/master
    

    这会将代码重新绑定到本地 . 在那之前确保你在正确的分支 .

  • 28

    用最简单的术语来说, git pullgit fetch 后跟 git merge .

    您可以随时 git fetch 更新 refs/remotes/<remote>/ 下的远程跟踪分支 .

    此操作永远不会更改 refs/heads 下的任何本地分支,并且可以安全地执行此操作而无需更改工作副本 . 我甚至听说有人在后台的cron作业中定期运行 git fetch (虽然我不建议这样做) .

    使用 git pull 可以使本地分支与其远程版本保持同步,同时还可以更新其他远程跟踪分支 .

    Git文档:git pull

相关问题