使用refspec差异进行Git pull / fetch

时间:2011-08-24 00:28:37

标签: git git-pull git-fetch

使用refspec是一种方便的方法来获取远程分支并创建一个类似的远程分支但具有给定名称(或者反过来:创建一个具有与本地名称不同的给定名称的远程分支)。我对一件小事感到困惑 - 因为拉也将与当前分支合并我期望不同的行为:

git fetch origin master:mymaster

git pull origin master:mymaster

上述两个命令似乎产生完全相同的结果 - 这是一个名为mymaster的本地分支,与origin / master相同。我是对的还是两者之间有一个模糊的区别?

最后,使用refspec将创建本地分支而非 跟踪分支,对吗?因为当一个人调用git push而没有任何参数AFAIK

时,会自动推送跟踪分支

4 个答案:

答案 0 :(得分:28)

refspec只是一个源/目的地对。使用带有x:y的refspec fetch告诉git在这个名为“y”的repo中创建一个分支,它是远程仓库中名为“x”的分支的副本。没别了。

使用pull,git会在顶部抛出合并。首先,使用给定的refspec完成提取,然后将目标分支合并到当前分支中。如果这令人困惑,这是一步一步:

git pull origin master:mymaster
  1. 转到原点并获得分支“master”
  2. 在本地制作一份名为“mymaster”的副本
  3. 将“mymaster”合并到当前分支
  4. 完全限定,即refs/heads/mymasterrefs/heads/master。为了进行比较,git在克隆上设置的默认refspec是+refs/heads/*:refs/remotes/origin/*refs/remotes提供了一个方便的命名空间,用于保持远程分支与本地分支分离。你正在做的是告诉git将远程跟踪分支放在与本地分支相同的命名空间中。

    对于“跟踪分支”,这只是配置文件中的一个条目,告诉git在默认情况下从哪里拉取本地分支。

答案 1 :(得分:4)

git fetch origin master:mymaster通过从远程存储库的主分支获取来更新本地存储库中的mymaster。

git pull origin master:mymaster执行上述操作并将其合并到当前分支中。

答案 2 :(得分:0)

git fetch origin master:mymaster

但是,该命令必须严格满足以下两个条件:

  1. 本地当前分支不能是mymaster。

  2. 本地mymaster分支是起源/主节点的祖先。

然后将进行快速合并,否则将报告致命。

当以上两个条件均成立时,执行命令:

git pull origin master:mymaster

除了执行命令:

git fetch origin master:mymaster

还将执行:

git merge FETCH_HEAD。

注意:不是git merge mymaster

FETCH_HEAD与mymaster不同,因为mymaster可能已经快进了合并。

答案 3 :(得分:-1)

我曾经使用过smartgit来创建分支,所以可能在那个分支上没有正确地合并到master中。 创建支持分支发布即支持/ 4.2,标签自动创建但现在我想尝试做git pull,它显示我同样的错误。 由于support / 4.2 brannch是在github中创建的,但未在本地合并。 所以我用过这个: - git pull origin master:mymaster

在我的情况下 - git pull origin support / 4.2:support / 4.2

它有效:)