正如我所看到的,git --track
和--set-upstream-to
都修改了一个分支,因此它成为一个跟踪(或上游)分支。但是,我无法理解的细微差别在哪里。 --track
记录"远程分支跟踪本地":
$ 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
位置。但似乎它要复杂得多吗?
答案 0 :(得分:7)
$ git checkout foo -b
$ git branch --track origin/retarget
前两个命令指示git:
origin/retarget
”的本地分支(非常糟糕,因为它被命名为远程跟踪分支“,而它实际上是一个简单的本地分支,其中包含'/
'名)foo
”,另一个本地分支)请参阅git branch
--track
创建新分支时,设置
branch.<name>.remote
和branch.<name>.merge
配置条目,将起点分支标记为新分支的“上游”。
从远程跟踪分支开始创建分支时,您将使用跟踪。
换句话说,你的第一个例子不是你如何使用--track
这会更好:
git checkout -b foo --track origin/retarget
至于--track
和--set-upstream-to
之间的差异:
--set-upstream-to
如果指定的分支尚不存在或者已经给出
--force
,则行为与--track
完全相同。
否则,在创建分支时设置--track
之类的配置,除了分支指向的地方未更改。
答案 1 :(得分:6)
假设你有一个master
分支被检出。现在当你做一个
$ git branch --track someBranch
您将创建一个名为someBranch
的新分支,根据master
分支跟踪更改。但是这个分支没有远程分支集。因此,您在git配置中看到remote = .
。
现在跟踪了someBranch
,这意味着更改将显示在git status
和git branch -v
中,就像遥控器一样。
例如,如果您在someBranch
上进行提交,那么当您执行1 ahead
或执行git branch -v
时,git会告诉您git status
它会显示给您
Your branch is ahead of 'master' by 1 commit.
这是最有趣的部分。跟踪分支,git向您显示它在master
之前提交1次(在您创建someBranch
时已检出的分支)