4

为什么“git remote show origin”将远程分支列为“已跟踪”,即使这些分支没有链接到本地​​分支以进行拉/推?在这种情况下,“跟踪”是否意味着其他东西?我认为这就是“跟踪”的全部含义:git docs on branch tracking

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

2)运行git remote show origin- 说“testBranch”被跟踪。但git branch -vv正确地只显示了主跟踪源/主,并git branch -a正确地显示只有一个本地分支,主。

git remote show origin3) 那么:当它将 testBranch 列为“已跟踪”时是什么意思?需要明确的是:设置方式没有任何“错误”:一切正常。我只是不明白为什么远程 testBranch 被标记为“已跟踪”。这就是我想要的答案。

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
4

1 回答 1

6

git remote show提到的“跟踪”与谈论的“跟踪”不同,git branch -vv它与git checkout -b <branch> <upstream>. (或者“不同”这个词可能太强了,因为基本思想是相同的,它谈论的是存储库中的远程跟踪分支,而不是您是否有一个本地分支恰好有其中一个作为其上游.)

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

fetch =远程命名的默认行为origin

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

注意两个*s。左边的一个匹配遥控器上存在的所有分支,而右边的一个表示“替换为左侧匹配的相同名称”。

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

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

进一步假设该分支newbr自您上次克隆、获取或以其他方式与 remote 交谈以来是新的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将不再提及它。

于 2015-02-07T05:58:25.640 回答