Як працюють гілки Git? Чи можна видалити головну гілку?


22

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

Коли я намагаюся видалити головну гілку, git branch -d masterвона видаляє її лише з мого локального сховища, а не на віддаленому сервері git. Будь-які ідеї?

Відповіді:


34

У Git філія - ​​це лише упорядкований список комітетів (він же: чекіни). Що може бути дещо заплутаним для нових користувачів, це те, що гілки не повинні мати ім’я (хоча в більшості випадків ви хочете таке); і немає нічого особливого у будь-якій конкретній гілці ( masterгілка є лише типовою, що створена для вас під час ініціалізації сховища).

Ви, напевно, це вже знаєте, але Git відрізняється від деяких інших систем управління версіями, як-от популярна "Subversion", тому що кожна "робоча копія" (мовою Subversion) є власним сховищем ... насправді, нічого особливо немає спеціальне про будь-яку конкретну копію; за винятком того, що одна копія була загально узгоджена як "канонічна", яка використовується для зберігання кінцевого продукту.

Отже, повернемось до вашого питання ... "канонічний" сховище, яке ви клонували, коли ви запускали локальну копію, містило за замовчуванням гілку "master"; і він застряг навколо. Тепер, якщо у вас був доступ до комп'ютера, який містить головне сховище, ви можете увійти та запустити:

git branch -d master

Однак якщо ви не можете цього зробити, ви все одно можете зробити це на своїй локальній машині. У git branchкоманди є -rпараметр, який впливає на віддалений сховище. Іншими словами, виконання наступної команди повинно працювати:

git branch -d -r master

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


Між іншим; якщо ви (або хтось інший) новачок у Git, я настійно рекомендую прочитати Git з Дна Джона Віглі . Незважаючи на те, що я трохи використовував Git самостійно, перш ніж знайшов цю статтю, я не дуже розумів, як вона працює, поки не прочитала її. Це цілком корисно!


3
Через деякий час, коли я написав свій оригінальний коментар, поведінка git дещо змінилася. Станом на git 1.7.12, git branch -d -r masterбільше не видаляє віддалену гілку - вона видаляє знання локальної копії про віддалену гілку. Наступного разу, коли ви git fetch, гілка повернеться! Замість цього вам захочеться бігти git push origin :master. По суті, те, що ви тут робите, - це переміщення нульової гілки (порожня назва гілки зліва від :) над верхньою частиною віддаленої гілки (назва гілки праворуч від :), фактично видаляючи її.
mparker17

Слід також зазначити, що під час клонування сховища зазвичай за замовчуванням перевіряється майстер. Це залежить від посилання HEAD у сховищі, яке ви клонуєте. Тому після видалення майстра переконайтеся, що HEAD вказує на гілку, яку ви хочете за замовчуванням.
Zitrax

Ваше посилання на Git з "Дна вгору " померло, але, здається, це текст, на який ви посилаєтесь (?). Чи можете ви підтвердити і, можливо, оновити посилання у відповіді?
АБО Mapper

АБО Mapper: Це текст, про який я маю на увазі: дякую за нове посилання! Я оновив посилання у відповіді.
mparker17

4

master- це гілка за замовчуванням для git. Я не знаю, чому для вас це так страшно, коли git повідомляє вам, наскільки далеко ви від майстра, але якщо ви хочете видалити гілку з віддаленого сховища, видалення її локально недостатньо. Спробуйте це замість цього:

git push origin :master

Це нічого не поштовхне (частина перед двокрапкою) до вашого початкового сервера і замінить майстер. Іншими словами, він повинен видалити головну гілку віддалено.


Я отримую: віддалений: помилка: відмова видалити поточну гілку: refs / heads / master До github.com ***. Git! [віддалений відхилений] майстер (видалення поточної гілки заборонено) помилка: не вдалося натиснути деякі відповіді на ' github.com ***. git'
Totty.js

1
@Totty, можливо, це може допомогти: matthew-brett.github.io/pydagogue/gh_delete_master.html
MEM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.