"git remote show origin": почему все ветви показывают "отслеженные", а некоторые нет?

Почему "git remote show origin" перечисляет удаленные ветви как "отслеженные", даже если эти ветви не связаны с локальной ветвью для pull/push? Означает ли "отслеживаемый" что-то еще в этом контексте? Я думал, что в этом весь смысл "отслеживаемых": git docs по отслеживанию веток.

1) клонировать репо с более чем одной удаленной веткой

2) бегать git remote show origin - говорит "testBranch" отслеживается. Но git branch -vv корректно показывает только мастер / источник отслеживания, и git branch -a правильно показывает, что есть только одна локальная ветка master.

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 ответ

Решение

"Отслеживается", что 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 является новым с тех пор, как вы последний раз клонировали, выбирали или общались с удаленным пользователем 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/newbr, git remote show origin перестану это упоминать.

Другие вопросы по тегам