git"--track"和"--set-upstream-to"有什么区别?

gri*_*yvp 18 git

正如我所看到的,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
Run Code Online (Sandbox Code Playgroud)

虽然--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
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别?我确信"跟踪分支"是一个简单的概念,upstream在分支内部追加指针,跟踪存储库head中指定分支的位置remote.但似乎它要复杂得多吗?

Von*_*onC 7

$ git checkout foo -b
$ git branch --track origin/retarget
Run Code Online (Sandbox Code Playgroud)

前两个命令指示git:

  • 创建一个名为" origin/retarget" 的本地分支(非常糟糕的主意,因为它被命名为远程跟踪分支",而它实际上是一个简单的本地分支/,其名称中带有' ')
  • 从当前分支开始(" foo",另一个本地分支)
  • 使新的本地分支跟踪其起点.

看到 git branch

--track
Run Code Online (Sandbox Code Playgroud)

创建新分支时,设置branch.<name>.remotebranch.<name>.merge配置条目以将起点分支标记为新分支的"上游".

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

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

git checkout -b foo --track origin/retarget
Run Code Online (Sandbox Code Playgroud)

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

--set-upstream-to
Run Code Online (Sandbox Code Playgroud)

如果指定的分支尚不存在或--force已经给出,则行为完全相同--track.
否则设置配置,就像--track创建分支时一样,除了分支指向的地方没有改变.


Ren*_*ink 7

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

$ git branch --track someBranch
Run Code Online (Sandbox Code Playgroud)

您将创建一个新分支,命名someBranch将根据master分支跟踪更改.但是这个分支没有远程分支集.因此你remote = .在git配置中看到了.

现在someBranch跟踪它意味着更改将出现在远程存在中git status并且git branch -v就像远程存在一样.

例如,如果您在someBranchgit 上进行提交,则会告诉您,1 ahead当您执行某项操作时,git branch -v或者当您执行此操作时,git status它会向您显示

Your branch is ahead of 'master' by 1 commit.
Run Code Online (Sandbox Code Playgroud)

这是最有趣的部分.跟踪分支,git显示它提前1次提交master(创建时检出的分支someBranch)