Как работают ветки Git? Можно ли удалить главную ветку?

22

У меня есть проект, который имеет 2 филиала, разработка и производство. Я не использую основную ветвь, и каждый раз, когда я пишу, git statusона говорит мне, насколько далеко моя ветвь от мастера.

Когда я пытаюсь удалить основную ветку, git branch -d masterона удаляется только в моем локальном хранилище, а не на удаленном git-сервере. Есть идеи?

УФК
источник

Ответы:

34

В Git ветка - это просто упорядоченный список коммитов (иначе: checkins). Что-то, что может немного сбить с толку новых пользователей, заключается в том, что ветвям не нужно иметь имя (хотя в большинстве случаев вы его хотите); и нет ничего особенно особенного в любой конкретной ветке ( masterветка - это просто ветка по умолчанию, которая создается для вас при инициализации репозитория).

Вы, вероятно, уже знаете это, но Git отличается от некоторых других систем контроля версий, таких как популярная «Subversion», потому что каждая «рабочая копия» (на языке Subversion) является собственным репозиторием ... на самом деле, нет ничего особенно специальные о любой конкретной копии; за исключением того, что одна копия была в целом согласована как «каноническая» копия, которая используется для хранения конечного продукта.

Итак, вернемся к вашему вопросу ... «канонический» репозиторий, который вы клонировали при запуске локальной копии, по умолчанию содержал «главную» ветку; и он застрял Теперь, если у вас был доступ к компьютеру, на котором находится главный репозиторий, вы можете войти и запустить:

git branch -d master

Однако, если вы не можете этого сделать, вы все равно можете сделать это с локального компьютера. У git branchкоманды есть -rопция, которая влияет на удаленный репозиторий. Другими словами, выполнение следующей команды должно работать:

git branch -d -r master

Обратите внимание, что в обоих этих случаях; Я предполагаю, что masterон полностью слился с историей разработки, в которой сейчас находится ваша локальная копия. Если вы никогда не использовали masterранее (то есть: вы когда-либо только регистрировались в developmentили production), вам не о чем беспокоиться. Однако, если вы (или кто-то еще) проверяли вещи master, то у вас может быть проблема. Вы можете заставить удаление путем изменения -dк -Dв приведенных выше командах; но я настоятельно рекомендую проверить, чтобы увидеть, что в masterзаранее! Если у вас нет доступа к удаленному компьютеру, вы, вероятно, не сможете его восстановить!


Кстати; Если вы (или кто-то еще) новичок в Git, я настоятельно рекомендую прочитать Git from the Bottom Up Джона Вигли . Несмотря на то, что я сам немного использовал Git, прежде чем нашел эту статью, я не понимал, как она работает, пока не прочитал ее. Это довольно полезно!

mparker17
источник
3
Некоторое время после того, как я написал свой оригинальный комментарий, поведение git немного изменилось. Начиная с git 1.7.12, git branch -d -r masterудаленная ветка больше не удаляется - она ​​удаляет знание вашей локальной копии об удаленной ветке. В следующий раз вы git fetchвернётесь! Вместо этого вы захотите бежать git push origin :master. По сути, здесь вы толкаете пустую ветку (имя пустой ветви слева от :) поверх удаленной ветви (имя ветви справа от :), эффективно удаляя ее.
mparker17
Также следует помнить, что при клонировании репозитория вы обычно по умолчанию извлекаете мастер. Это зависит от ссылки на HEAD в репозитории, который вы клонируете. Поэтому после удаления мастера убедитесь, что HEAD указывает на ветку, которую вы хотите использовать по умолчанию.
Цитрак
Ваша ссылка на Git с Bottom Up умерла, но, похоже, это текст, на который вы ссылаетесь (?) Не могли бы вы подтвердить и, возможно, обновить ссылку в ответе?
ИЛИ Mapper
ИЛИ Mapper: это текст, на который я ссылаюсь: спасибо за новую ссылку! Я обновил ссылку в ответе.
mparker17
4

masterявляется веткой по умолчанию для git. Я не знаю, почему для вас так ужасно, когда git сообщает вам, как далеко вы от мастера, но если вы хотите удалить ветку в вашем удаленном репозитории, локального удаления недостаточно. Попробуйте это вместо этого:

git push origin :master

Это ничего не вытолкнет (часть перед двоеточием) на ваш исходный сервер и перезапишет мастер. Другими словами, он должен удалить главную ветку удаленно.

InnaM
источник
Я получаю: remote: error: отказываясь удалить текущую ветку: refs /heads / master На github.com ***. Git! [удаленный отклоненный] мастер (удаление текущей ветки запрещено) ошибка: не удалось
отправить
1
@Totty, возможно, это может помочь: matthew-brett.github.io/pydagogue/gh_delete_master.html
MEM