"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
перестану это упоминать.