首页 文章

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

提问于
浏览
10549

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

git pullgit fetch 之间有什么区别?

30 回答

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

  • 172

    git pull ==(git fetch git merge)

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

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

  • 190

    我们简单地说:

    git pull == git fetch + git merge
    

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

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

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

  • 347

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

    git fetch
    git diff ...origin
    
  • 87

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

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

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

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

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

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

  • 31

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

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

  • 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+               -
    ---------------------     -----------------------     -----------------------
    

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

  • 42

    enter image description here

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

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

  • 33

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

    enter image description here

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

  • 47

    有时,视觉表现有帮助 .

    enter image description here

  • 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

  • 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”,则可以获取,因为某些人已在此处标记了一些文章 .

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

  • 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
    

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

  • 95
    git pull = git fetch + git merge
    
  • 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),否则请勿使用此选项 .

  • 161

    将git的设计理念与更传统的源