在分支上执行Git获取和拉取操作

在分支上执行Git获取和拉取操作,git,branch,fetch,pull,Git,Branch,Fetch,Pull,以前可能有人问过这个问题,但我找不到答案 假设以下场景 我有一个具有以下本地分支的本地存储库 Scenario 1 local Branch A Branch B Branch C (not reachable from A or B) 如果我在分支A上执行拉操作,我是否会隐式地为B和C执行抓取操作?在pull操作中执行的fetch与仅仅执行fetch不同吗 如果我在C上取头,我在A和B上取头吗 场景二只有分支A在本地签出怎么办 Scenario 2 local

以前可能有人问过这个问题,但我找不到答案

假设以下场景

我有一个具有以下本地分支的本地存储库

Scenario 1 

local
    Branch A
    Branch B
    Branch C (not reachable from A or B)
如果我在分支A上执行拉操作,我是否会隐式地为B和C执行抓取操作?在pull操作中执行的fetch与仅仅执行fetch不同吗

如果我在C上取头,我在A和B上取头吗

场景二只有分支A在本地签出怎么办

Scenario 2

local
    Branch A

Remote
    Branch A
    Branch B
    Branch C (not reachable from A or B)
  • 您对这两种情况的描述(以及两者之间的区别)并不十分清楚,因为如果远程设备有一些分支名称
    A
    B
    C
    ,它将始终存在于您的本地回购协议以及
    origin/A
    origin/B
    origin/C
    ,(使用
    git fetch
    git pull
    更新远程后),无论是否在本地签出分支

  • fetch
    用于从远程获取更新的提交列表。
    fetch
    作为
    pull
    操作的第一个命令完成

    通常的语法是
    git fetch

    refspec参数是可选的。如果指定失败,git将从远程提取所有ref。通过refs,它将包括refspec中所有可到达的头和标记

  • 不带任何refspec的
    git pull
    命令将从远程引入所有ref,而NOT只是与您当前要合并到的本地分支相对应的提交

  • 在场景1中,如果在当前签出分支
    a
    时运行
    git pull origin
    ,那么git将在本地repo中更新
    origin/a
    origin/B
    origin/C
    。此外,它将
    origin/a
    合并到
    a

  • 在场景1中,如果运行
    git fetch origin C
    ,则只有本地回购中的
    origin/C
    将得到更新。由于此
    fetch
    ,也不会有任何合并

  • 场景2将产生与场景1相同的结果。远程的所有REF都将更新到本地回购的
    /BLAH
    分支。事实上,场景2与场景1没有什么不同,只是您签出的本地分支较少,这对于
    提取操作来说应该没有任何影响。

顺便说一句,要回答您在评论中提出的关于git pull origin和git fetch origin做什么的问题,请执行以下操作:

  • git pull origin
    做了一些与您可能期望它做的不同的事情

    • git将
      的提交从远程引入
      FETCH\u HEAD
      而不是
      origin/
    • 它不会更新
      origin/
    • 它将
      FETCH_HEAD
      合并到当前签出的分支中,因此就本地分支状态而言,可以获得类似的最终结果
  • git-fetch-origin
    的行为与上述的
    git-pull-origin
    非常相似,不同的是它只是将
    的提交从远程引入
    fetch\u HEAD

  • 如果确实要仅获取与特定分支对应的提交,则需要使用正确的refspec参数。请阅读有关它的详细信息。要仅从远程
    和分支
    获取提交,正确的命令为:

     git pull origin refs/heads/master:refs/remotes/origin/master
    
  • 您还可以将refspecs与
    fetch
    一起使用,仅将提交提取到
    origin/master
    ,而不合并到本地分支中:

     git fetch origin refs/heads/master:refs/remotes/origin/master
    
  • 如果您不想为
    git pull
    键入长refspec,并且不介意从远程获取有关所有ref的信息,并且没有远程跟踪分支集,则可以执行以下操作:

    git fetch origin
    git checkout <BRANCH-THAT-NEEDS-TO-BE-MERGED-INTO>
    git merge origin/<BRANCH-TO-BE-MERGED-FROM>
    
    • 您对这两种情况的描述(以及两者之间的区别)并不十分清楚,因为如果远程设备有一些分支名称
      A
      B
      C
      ,它将始终存在于您的本地回购协议以及
      origin/A
      origin/B
      origin/C
      ,(使用
      git fetch
      git pull
      更新远程后),无论是否在本地签出分支

    • fetch
      用于从远程获取更新的提交列表。
      fetch
      作为
      pull
      操作的第一个命令完成

      通常的语法是
      git fetch

      refspec参数是可选的。如果指定失败,git将从远程提取所有ref。通过refs,它将包括refspec中所有可到达的头和标记

    • 不带任何refspec的
      git pull
      命令将从远程引入所有ref,而NOT只是与您当前要合并到的本地分支相对应的提交

    • 在场景1中,如果在当前签出分支
      a
      时运行
      git pull origin
      ,那么git将在本地repo中更新
      origin/a
      origin/B
      origin/C
      。此外,它将
      origin/a
      合并到
      a

    • 在场景1中,如果运行
      git fetch origin C
      ,则只有本地回购中的
      origin/C
      将得到更新。由于此
      fetch
      ,也不会有任何合并

    • 场景2将产生与场景1相同的结果。远程的所有REF将更新到本地回购的
      /BLAH
      分支。事实上,场景2与场景1没有什么不同,只是您的本地bra较少
      72a90cf95456b14630ddff427c3df1b00be24670                branch 'master' of git://github.com/foo/bar.git