2014-11-22 364 views
15

正如我所看到的,git --track--set-upstream-to修改了一个分支,因此它变成了一个跟踪(或上游)分支。但我无法理解的细微差别在哪里。该--track记录“远程分支轨道地方”:git“--track”和“--set-upstream-to”有什么区别?

$ git checkout foo -b 
$ git branch --track origin/retarget 

Branch origin/retarget set up to track local branch foo. 

$ cat .git/config 
[branch "origin/retarget"] 
     remote = . 
     merge = refs/heads/foo 

虽然--set-upstream-to纪录“的本地分支轨道远程分支”:

$ git checkout foo -b 
$ git branch --set-upstream-to origin/retarget 

Branch foo set up to track remote branch retarget from origin. 

$ cat .git/config 
[branch "foo"] 
     remote = origin 
     merge = refs/heads/retarget 

这是什么两者之间的区别?我确信“跟踪分支”是一个简单的概念,其中额外的upstream分支内的指针跟踪head指定分支在remote存储库中的位置。但似乎更复杂?

回答

6
$ git checkout foo -b 
$ git branch --track origin/retarget 

前两个命令指示GIT中:

  • 创建一个名为“origin/retarget”(非常糟糕的主意本地分支,因为它被命名为远程跟踪分支”,而它实际上一个是简单的本地分支在其名称中的“/”)
  • 从当前分支开始(“foo”,另一个地方分支)
  • 作出新的本地分支跟踪它的出发点。

参见git branch

--track 

当创建一个新的分支,建立branch.<name>.remotebranch.<name>.merge配置条目到起始点分支标记为从新的支路“上游”。

从远程跟踪开始创建分支时,您将使用跟踪。

换句话说,你的第一个例子不是你将如何使用--track
这将更好的工作:

git checkout -b foo --track origin/retarget 

至于--track--set-upstream-to之间的区别:

--set-upstream-to 

如果指定的分支不存在,或者如果--force已经给出,行为完全像--track
否则,在创建分支时会设置像--track这样的配置,除非分支指向的地方不会更改

3

我们假设您有一个master分支已签出。现在,当你做一个

$ git branch --track someBranch 

您将创建一个名为someBranch新的分支,它的变化将根据master分支进行跟踪。但是这个分支没有设置远程分支。因此你在git配置中看到remote = .

现在someBranch被跟踪,这意味着改变将出现在git statusgit branch -v就好像一个远程存在一样。

例如,如果你犯了一个提交上someBranch git会告诉你,你是1 ahead当你做一个git branch -v或当你做一个git status这表明你

Your branch is ahead of 'master' by 1 commit. 

这是interessting一部分。该分支被跟踪,git向您显示它提前1提交master(当您创建someBranch时签出的分支)