2013-04-27 43 views
1

这可能是之前问过的,但我找不到答案。对分支机构的Git抓取和拉动操作

假设下列情况。

我有一个本地存储库与以下本地分支机构。

Scenario 1 

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

如果我在分支A上并做拉,我是否隐式地为B和C执行提取?抓取操作中的抓取操作是否只是在执行抓取操作时以不同的形式完成?

如果我在C上读取,我是否为A和B读取HEAD?

如果分支A只在本地签出,情况二如何?

Scenario 2 

local 
    Branch A 

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

见http://stackoverflow.com/questions/292357/whats-the-difference-between-git-pull-and-git-fetch – Joe 2013-04-27 17:44:24

回答

1
  • 你的描述(以及之间的差异)的两种情况不太清楚,因为如果遥控器有一些分支机构名称ABC,它总是会在你的本地回购存在以及origin/A,origin/Borigin/C(在更新远程使用git fetchgit pull后),而不管您是否已在本地签出分支。

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

    常用语法为git fetch <REMOTE> <REFSPEC>

    操作的Refspec参数可选。如果你没有指定一个,git将会从远程获取所有的ref。通过参考,它包括refspec中所有可到达的头和标签。

  • git pull <REMOTE>命令不带任何refspecs会在所有裁判把从远程,以及对应于你归并到当前的本地分支只是提交。

  • 在方案1,如果你运行一个git pull origin当你当前已签出分支A,是Git是要在你的本地回购更新origin/Aorigin/Borigin/C。另外,它将合并origin/AA

  • 在情况1中,如果您运行的是git fetch origin C,那么本地仓库中只有origin/C即将更新。由于此fetch将不会合并。

  • 场景2将产生与场景1相同的结果。所有来自远程的参考将更新到您当地的仓库<REMOTE_NAME>/BLAH分支。事实上,场景2与场景1没有区别,只是您签出的本地分支较少,对于fetch操作而言,这无关紧要。

BTW回答什么git pull origin <BRANCHNAME>git fetch origin <BRANCHNAME>不要在评论你的问题:

  • git pull origin <BRANCHNAME>做一些事情可能比你期望它做什么不同。

    • GIT中带来从远程的供提交到<BRANCHNAME>代替FETCH_HEADorigin/<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 
    
  • 你也可以使用refspecs与fetch只取提交到origin/master没有任何合并到本地分支:

    git fetch origin refs/heads/master:refs/remotes/origin/master 
    
  • 如果你不想为git pull键入长refspecs,并且不介意有关从远程所有裁判的信息,而你没有一个远程跟踪分支集,然后你可以只这样做:

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

奖金 - 什么是GIT_FETCH_HEAD吗?

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

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

对于方案二,我认为你能理解我反正。 :),通常当你分支你帐篷不跟踪远程分支。只需一个省略-u。因此你需要做“git pull origin ”,这是否也意味着你会做git fetch来源,因此只更新原点/ ? – user1043825 2013-04-27 18:48:13

+0

@ user1043825 - 更新了答案,详细解释了什么'git pull origin '和'git fetch origin '做以及为什么这些命令没有真正做到您期望的那样;) – Tuxdude 2013-04-27 19:34:38

+0

感谢您的深入解答所有。如果我正确地理解了你,假设情况1,如果我做了“git pull origin A”,我将只用pull命令中的隐式获取更新GIT_FETCH_HEAD,甚至不更新origin/a,或者origin/b或origin/c,并且将Fetch_Head合并到A.这也意味着在git pull origin A后,A和origin/A不会同步,是正确的? – user1043825 2013-04-27 20:02:33