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

时间:2013-04-27 14:43:35

标签: git branch fetch pull

之前可能会问过,但我找不到答案。

假设以下情况。

我有一个本地存储库,其中包含以下本地分支。

Scenario 1 

local
    Branch A
    Branch B
    Branch C (not reachable from A or B)

如果我在分支A上做拉,我是否隐含地对B和C进行取指?在pull操作中完成的提取是否只是执行fetch?

如果我在C上获取,我是否获取A和B的HEAD?

情况二怎么样只在本地检出分支A?

Scenario 2

local
    Branch A

Remote
    Branch A
    Branch B
    Branch C (not reachable from A or B)

1 个答案:

答案 0 :(得分:1)

  • 您对两种方案的描述(以及它们之间的区别)并不十分清楚,因为如果遥控器有一些分支名称ABC,它将始终存在于您的本地仓库以及origin/Aorigin/Borigin/C中(在您使用git fetchgit pull更新远程广告后),无论你是否在本地检查过分支机构。

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

    通常的语法是git fetch <REMOTE> <REFSPEC>

    refspec参数是可选的。如果你没有指定一个,git将从遥控器中提取所有引用。通过引用,它包括refspec中所有可到达的头部和标签。

  • 没有任何refspecs的git pull <REMOTE>命令将从远程引入所有引用, NOT 只引用与您正在合并的当前本地分支相对应的提交成。

  • 在方案1中,如果您在当前检出分支git pull origin时运行A,则是git将更新origin/Aorigin/B ,以及当地仓库中的origin/C。此外,它会将origin/A合并到A

  • 在方案1中,如果您运行git fetch origin C,则本地仓库中只有origin/C会更新。由于这个fetch

  • 将不会合并
  • 场景2将产生与场景1相同的结果。来自遥控器的所有引用都将更新到本地仓库的<REMOTE_NAME>/BLAH分支。实际上,场景2与场景1没有什么不同,只是您签出的本地分支较少,这对于fetch操作无论如何都不重要。

顺便说一句,在git pull origin <BRANCHNAME>git fetch origin <BRANCHNAME>所做的评论中回答你的问题:

  • git pull origin <BRANCHNAME>会做出与您预期的不同的事情。

    • git将来自远程的<BRANCHNAME>提交引入FETCH_HEAD而不是origin/<BRANCHNAME>
    • 它不会更新origin/<BRANCHNAME>
    • 它将FETCH_HEAD合并到您当前检出的分支中,因此就本地分支状态而言,它实现了类似的最终结果。
  • git fetch origin <BRANCHNAME>与上述git pull origin <BRANCHNAME>的行为非常相似,只不过只需将<BRANCHNAME>的提交从远程转入FETCH_HEAD即可停止。

  • 如果您确实只想获取与特定分支对应的提交,则需要使用正确的refspec参数。阅读更多信息here。要仅从远程origin和分支master获取提交,正确的命令将是:

     git pull origin refs/heads/master:refs/remotes/origin/master
    
  • 您还可以使用fetch的refspec来仅将提交提取到origin/master,而不会将任何合并到您的本地分支中:

     git fetch origin refs/heads/master:refs/remotes/origin/master
    
  • 如果您不想为git pull键入长引用规范,并且不介意从远程获取有关所有引用的信息,并且您没有远程跟踪分支集,那么你可以这样做:

    git fetch origin
    git checkout <BRANCH-THAT-NEEDS-TO-BE-MERGED-INTO>
    git merge origin/<BRANCH-TO-BE-MERGED-FROM>
    

奖励 - GIT_FETCH_HEAD做什么?

这是git用来跟踪远程存储库中的任何提取的短命ref。您可以通过查看文件FETCH_HEAD来查看.git/FETCH_HEAD的当前值。例如:

72a90cf95456b14630ddff427c3df1b00be24670                branch 'master' of git://github.com/foo/bar.git