2015-10-19 3 views
1

У меня есть две ветки на дистанционном репо - мастер и разработка.Почему git checkout создает ветку, которая отслеживает удаленную ветку?

Теперь, после клонирования репозитория, я был на локальной локальной ветви с именем master. После git checkout development, это сообщение, которое я получил:

Отдел развития, разработанный для отслеживания развития удаленной ветви от источника. Переведено в новое подразделение «разработка»

Как это могло быть? Я не указал флаг -b, чтобы создать новый локальный ветвь. Если я сделаю git checkout adasdasd, я получаю error: pathspec 'asdasdasd' did not match any file(s) known to git., что имеет смысл. Но разве это просто поведение по умолчанию git (создание локальной ветви, если имя, указанное в checkout, соответствует удаленной ветке)?

Короче говоря, это выглядит как git checkout development, выполняется в первый раз, фактически выполняется git checkout -b development origin/development.

+1

Зачем вам нужна локальная ветка с тем же именем, что и удаленная ветвь, но это * не * отслеживает удаленную ветку? Существует много возможностей для путаницы, когда вы используете систему управления версиями, например 'git', зачем создавать больше? – Caleb

+0

@Caleb, потому что удаленная ветвь называется чем-то вроде 'development' - имя, которое может быть трудно избежать? Имейте в виду, что на нескольких пультах может быть сотни филиалов, имена которых кто-то хочет использовать локально. – jwg

ответ

0

Это просто означает, что клонированный вами репозиторий имеет ветвь development на удаленном (GitHub).

Когда вы клонировали его, все удаленные ветви тоже были клонированы. Вот почему git checkout development работал (переключил вас на ветку development).

Если вы нашли это неожиданное, вы можете удалить его с пульта дистанционного управления:

git push origin --delete development 

Протолкнуть ветвь на пульте дел (вы, вероятно, сделал это, когда вы толкнул свой филиал на GitHub):

git push origin development 
# or 
git push --all # this will push all your branches 
+0

Но когда я снова делаю 'git checkout master' и' git checkout development', сообщение, которое я получаю на этот раз, - 'Switched to branch development'. Значит, это был не просто переход к существующей ветке, не так ли? Короче говоря, это выглядит как 'git checkout development', запускается в первый раз, фактически выполняется' git checkout -b development origin/development'. – user4205580

2

Да, если вы проверяете ветку, которая существует как удаленная, предполагается, что вы хотите создать ветвь, которая отслеживает удалённую ветку.

Из документов:

Если не найден, но там существует ветвь отслеживания в точности один удаленный (назовем его < удаленного >) с соответствующим именем, рассматривать как эквивалент

$ git checkout -b <branch> --track <remote>/<branch> 

Это, очевидно, очень полезно в большинстве случаев - это обычно то, что люди хотят делать. Если вы хотите, чтобы ваш филиал был основан на вашем текущем, а не ветке удаленного отслеживания с тем же именем или при столкновении имен, это раздражает.

Если вы делаете git checkout -b foo, этого не произойдет. Обратите внимание, если у вас еще нет ветки с именем foo, это то, что вы хотите в любом случае.

Смежные вопросы