Здесь есть несколько отдельных, но взаимосвязанных ключевых понятий.
Во-первых, хотя у Git есть названия веток, это не все, что есть в Git (и в этом отношении термин ветвь неоднозначен: см. также Что именно мы подразумеваем под ветвью?). В Git также есть теги и то, что Git называет названия веток удаленного отслеживания, и все они попадают в общую категорию, называемую ссылки.
Имя ветки, такое как master
, — это просто ссылка, полное имя которой начинается с refs/heads/
.
Имя ветки удаленного отслеживания, такое как origin/iOS
, представляет собой ссылку, полное имя которой начинается с refs/remotes/
, за которым следует имя самой удаленной ветки (origin
) и еще одна косая черта. Последняя часть, iOS
, это то, что ваш Git обычно копирует из другого Git.
(Часть remote здесь представляет собой почти произвольную строку. Вы можете придумать свои собственные имена удаленных устройств. Однако тот факт, что к имени удаленного устройства добавляется косая черта, связан с причиной, по которой вы должны будьте осторожны с использованием косой черты в ваших удаленных именах.)
Чтобы завершить этот конкретный список, имя тега, такое как v1.0
, является просто ссылкой, чье полное имя начинается с refs/tags/
. Существует еще больше форм ссылок (refs/notes/
для git notes
в Git, а GitHub использует, например, refs/pull/
), но ветки, теги и ветки удаленного отслеживания встроены, стандартны и, что наиболее важно, хорошо заметны — так что вы должны знать о них.
Когда вы запускаете git branch
, Git находит все ваши имена ссылок refs/heads/
и показывает их с удаленным refs/heads/
. Когда вы запускаете git branch -r
, Git находит все ваши ссылки refs/remotes/
и показывает их с удаленным refs/remotes/
. Когда вы запускаете git branch -a
, Git находит оба и показывает первый с удаленным refs/heads/
, но показывает второй только с удаленным refs/
. (Почему? Кто знает! Это Git шутит. :-))
Это объясняет, почему вы видите то, что видите, а не то, что происходит с git clone --mirror
, или почему вы можете git checkout iOS
и вдруг получить новый refs/heads/iOS
; и для этого нам нужны еще два элемента, о refspecs (используемых с git fetch
и git push
) и о что Git вызывает DWIM или Do What I Mean в git checkout
.
Короче говоря, refspec — это просто пара ссылок, разделенных двоеточием, иногда одна часть которых заменена на *
. Например, refs/heads/*:refs/remotes/origin/*
— это refspec. Вы также можете добавить перед refspec начальный знак плюс; это устанавливает флаг --force
. И git fetch
, и git push
работают со спецификациями ссылок (и у обоих есть собственный флаг --force
, который эффективно добавляет +
к любым спецификациям ссылок, которые вы указываете в командной строке). Ссылка перед двоеточием — это источник, а ссылка после двоеточия — назначение, и это важно, поскольку в git fetch
задействованы два Git'а. и git push
: ваш и некоторые другие Git.
Когда вы git fetch
, исходные ссылки являются ссылками других Git, а целевые — вашими. Когда вы git push
, исходные ссылки принадлежат вам, а целевые — их.
Использование git clone --mirror
говорит вашему Git установить голый репозиторий (который я оставлю здесь неопределенным) и установить +refs/*:refs/*
в качестве refspec для git fetch
. Это копирует все ссылки из другого Git в origin
, но это означает, что вы не можете иметь свои собственные ветки: ваш Git теперь является точной копией их, и каждый раз, когда вы запускаете git fetch
, вы заменяете все, что у вас есть с... их точная копия, опять же.
Основной смысл большинства операций git clone
– получить неточную копию своего Git. Основная идея здесь заключается в том, что вам нужна вся их ветка. имена, которые станут вашими именами филиалов для удаленного отслеживания. Их master
становится вашим origin/master
; их iOS
становится вашим origin/iOS
.
Это не оставляет места для их origin/*
, потому что у вашей неточной копии есть свои origin/*
. Если вы хотите получить их ветки удаленного отслеживания, вы можете это сделать, но вам нужно дать им другое имя!
Как только у вас есть свой (не зеркальный) клон, а его whatever
становится вашим origin/whatever
, вы можете git checkout whatever
и действие DWIM, о котором я упоминал (и на которое я ссылался) выше, вступает в игру, создавая новый локальный whatever
, используя свои собственные origin/whatever
, которые вы скопировали из их whatever
!
person
torek
schedule
13.06.2017
git branch -r
в этом репо. Запускgit branch -r
не отображает ветки в этом репо. В нем перечислены удаленные ветки. Т.е.develop
,iOS
иneatUI
— это ветки в каком-то другом репозитории, из которого был клонирован репозиторий вашего сервера. Чтобы перечислить ветки в репозитории вашего сервера, вы должны запустить толькоgit branch
без флага-r
. - person Alderath   schedule 13.06.2017git remote add origin2 <url from which your remote repo was cloned>
(origin2
здесь просто имя, которое вы можете выбрать как хотите). Затем вы можете получить ветки с этого удаленногоgit fetch origin2
. После этого, если вы выполнитеgit branch -r
в своем клонированном репозитории, вы должны увидеть ветки удаленного отслеживания для обоих удаленных репозиториев:origin/develop origin2/develop origin2/neatUI origin2/iOS
- person Alderath   schedule 13.06.2017