"git remote show origin":为什么所有分支都显示 "tracked" 而有些分支却没有?

"git remote show origin": why all branches show "tracked" even when some aren't?

为什么 "git remote show origin" 将远程分支列为 "tracked",即使这些分支没有链接到 pull/push 的本地分支? "tracked" 在这种情况下是否还有其他含义?我认为这就是 "tracked" 的全部含义:git docs on branch tracking.

1) 克隆一个有多个远程分支的仓库

2) 运行 git remote show origin -- 表示 "testBranch" 被跟踪。但是 git branch -vv 正确显示只有主跟踪 origin/master,并且 git branch -a 正确显示只有一个本地分支,master。

3) 那么:git remote show origin 将 testBranch 列为 "tracked" 是什么意思?需要明确的是:设置方式与 "wrong" 无关:一切正常。我只是不明白为什么远程 testBranch 被标记为 "tracked"。这就是我想要的答案。

hawk@Tug:~/temp/TestRepo (master)$ git remote show origin
* remote origin
  Fetch URL: git@github.com:haughki/TestRepo.git
  Push  URL: git@github.com:haughki/TestRepo.git
  HEAD branch: master
  Remote branches:
    master     tracked
    testBranch tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)
hawk@Tug:~/temp/TestRepo (master)$ git branch -vv
* master 8df130e [origin/master] shoulda done this last time
hawk@Tug:~/temp/TestRepo (master)$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/testBranch

git remote show所说的"tracked"与git branch -vv所说的"tracking"不同,后者与git checkout -b <branch> <upstream>同时出现。 (或者 "different" 这个词可能太强了,因为基本思想是相同的,它谈论的是你的存储库中的远程跟踪分支,而不是你是否有一个本地分支恰好有其中一个它的上游。)

特别是,git remote show 检查给定遥控器的 fetch = 行,并将其与遥控器上现在实际可用的参考资料进行比较(运行 git ls-remote 看看那些)。

名为 origin 的远程的默认 fetch = 行显示为:

fetch = +refs/heads/*:refs/remotes/origin/*

注意两个 *。左边的匹配遥控器上存在的所有分支,而右边的表示 "replace with the same name matched on the left".

假设远程 origin 当前有以下引用:

refs/heads/master
refs/heads/newbr
refs/tags/v1.2
refs/notes/commits

进一步假设分支 newbr 自上次克隆、获取或以其他方式与远程 origin 交谈后是新的,因此 git branch -r 将仅列出 origin/master, 而不是 origin/newbr.

如果你现在 运行 git remote show origin 你会得到(连同其他东西)这个位:

    master tracked
    newbr  new (next fetch will store in remotes/origin)

这意味着两个分支都匹配,并且您已经有 refs/remotes/origin/master,但还没有 refs/remotes/origin/newbr

一旦你运行git fetch,你将获得origin/newbr。但是,如果在执行 运行 git fetch 之前,您更改了 fetch = 行,这样您 就不会 获取 origin/newbrgit remote show origin就不提了