“git remote show origin”:为什么所有分支都显示“跟踪”,即使有些不是?

时间:2015-02-07 01:56:06

标签: git git-branch git-remote git-track

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

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

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

3)所以:git remote show origin在将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

1 个答案:

答案 0 :(得分:3)

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/*

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

假设远程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将停止提及它

相关问题