16

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

git fetch origin master:mymaster

并从

git pull origin master:mymaster

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

最后,使用 refspec 将创建一个本地分支不是跟踪分支,对吗?由于当一个人在没有任何参数的情况下调用 git push 时自动推送跟踪分支 AFAIK

4

4 回答 4

32

refspec 只是一个源/目标对。使用 refspecx:y告诉fetchgit 在这个 repo 中创建一个名为“y”的分支,它是远程 repo 中名为“x”的分支的副本。没有其他的。

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

git pull origin master:mymaster
  1. 转到原点并获取分支“master”
  2. 在本地创建一个名为“mymaster”的副本
  3. 将“mymaster”合并到当前分支

完全合格,那将是refs/heads/mymasterand refs/heads/master。为了比较,git 在克隆上设置的默认 refspec 是+refs/heads/*:refs/remotes/origin/*. refs/remotes为保持远程分支与本地分支分开提供了一个方便的命名空间。您正在做的是告诉 git 将远程跟踪分支放在与本地分支相同的命名空间中。

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

于 2011-08-24T01:12:15.230 回答
4

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

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

于 2011-08-24T01:06:51.207 回答
0

git fetch origin master:mymaster

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

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

  2. 本地 mymaster 分支是 origin/master 的祖先。

然后将进行快进合并。否则会报致命。

当上述两个条件都为真时,执行命令:

git pull origin master:mymaster 

除了执行命令:

git fetch origin master:mymaster

也会执行:</p>

git merge FETCH_HEAD

注意:not git merge mymaster

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

于 2019-07-28T04:38:18.213 回答
-1

我曾使用 smartgit 创建分支,因此该分支可能没有正确合并到 master 中。为发行版创建支持分支,即 support/4.2,自动创建标签,但现在我尝试执行 git pull,它显示了同样的错误。由于 support/4.2 分支是在 github 中创建的,但未在本地正确合并。所以我使用了这个:- git pull origin master:mymaster

就我而言 - git pull origin support/4.2:support/4.2

有用 :)

于 2015-07-09T06:31:17.297 回答