Коли настав час видалити гілку функції git?


88

Я не хочу, щоб у підсумку висіло 82 гілки об’єктів , тому мені цікаво, якими потенційними недоліками може бути просто видалення гілки об’єктів, як тільки я об’єднаю її в майстер.

Робочий процес:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

Тут є якісь проблеми?


1
Я б сказав, що проблем немає, тому що якщо вони вам дійсно потрібні, ви завжди можете відновити видалену гілку пізніше.
slebetman

@slebetman Наскільки я знаю, видалену гілку не можна воскресити. Однак, якщо гілка була повністю об'єднана в master перед видаленням, гілка більше не потребуватиме.
Симеон

1
@Simeon Так, ти можеш. Git ніколи не видаляє коміти, тому, коли ви видаляєте свою гілку, ви просто видаляєте її ім'я. Щоб відновити видалену гілку, вам просто потрібно запам’ятати останнє, що ви вчинили для цієї гілки, і ви можете її шукати git reflog. Потім
оформіть

@slebetman, це буде правдою лише в тому випадку, якщо зрештою гілка була об’єднана. якщо коміти залишаються позаду, вони врешті-решт стануть недосяжними і через певний час підлягатимуть вивозу сміття. навіть записи в перегляді з часом будуть очищені, за замовчуванням у вас є близько 90 днів.
goldenratio

@goldenratio: Будь-яке посилання на це?
slebetman

Відповіді:


61

Видалення після злиття - звичайний спосіб. Ось чомуgit branch -d yourbranchname перевіряє, щоб гілка була повністю об’єднана, перш ніж її буде видалено.

Є кілька причин, якими я можу подумати, щоб зберегти гілку навколо: можливо, ви захочете затримати її на випадок, якщо у вас з’являться помилки, щойно вони з’являться у виробництві, або ви хочете отримати історичний запис.

У будь-якому випадку у вас є можливість позначити голову гілки, перш ніж видалити її. Тег схожий на гілку, оскільки є покажчиком на коміт, за винятком кількох незначних відмінностей: 1) порцеляна зазвичай не відображає теги в командах-дослідниках, таких як git show-branch або tab-auto complete під час оформлення замовлення, 2) перевіряючи один, ви потрапляєте у відокремлену (невід'ємну) ГОЛОВУ 3) ви можете залишити " повідомлення про позначення ", що призводить до того, що тег зберігається як об'єкт у сховищі об'єктів, як фіксація.

Таким чином ви зберігаєте історію, і якщо вам коли-небудь знадобиться виправити помилку, я рекомендую просто створити нову гілку майстра для виправлення.


1
Перевірка тегу встановлює HEAD, але не створює автоматично гілку. HEAD при фіксації без гілки - це те, що робить її відокремленою.
Бінаріан,

1
Ви маєте рацію, він встановлює для HEAD ідентифікатор коміту, а не посилання. Ця частина мого опису неправильна. Я повинен його оновити.
masonk

96

Я видаляю після злиття, але завжди роблю a git merge --no-ff, щоб уникнути швидкого пересилання вперед, щоб історія гілок була видно на графіку. Мені подобається мати історію того, де гілка об’єкта відійшла від гілки розробки і де вона приєдналася назад:

Злиття із швидким перемотуванням або без нього

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


Це ще один приємний спосіб зберегти історію, оскільки ви можете вибрати коміти, до яких можна отримати доступ з функції, але не з master: rev ^ 1..rev ^ 2. Зворотний бік полягає в тому, що він перекручує будь-які перебазування, які ви можете зробити із вашої гілки майстра (наприклад, якщо ви хочете, щоб майстер перебазувався на пульт дистанційного керування, що дуже часто).
masonk

1
У мене не було цієї проблеми. Наша команда синхронізується через github, і мені, як правило, не потрібно перебазувати, але я не думаю, що це є мінусом. Навіть якщо ви перебазуєте свою гілку розробки та функцій, розгалуження залишається видимим на графіку, і важливо те, що знаходиться в гілці об'єктів щодо розробки, а не коміт, куди ви відходили спочатку, коли створювали цю гілку.
lkraider

@Ikraider, дякую за нагадування. Я бачив цю статтю, коли я вперше вивчав git, зараз для мене це має більше сенсу. Я перебазую свої гілки функцій, але merge --no-ffповертаюся до майстра, тому що, як ви говорите, ви можете бачити історію.
bstpierre

7

Я можу подумати з двох причин, чому ви хочете трохи зберегти гілку функцій навколо:

  • Є ймовірність, що його вам повернуть для подальшої роботи вгору.
  • Інші розробники, можливо, хочуть цю функцію, не бажаючи всього іншого в master.

На практиці більшість випадків видалення після злиття просто чудово.


6

Типовим буде робочий процес

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master

1

я думаю, що це типовий робочий процес (видалення після злиття)

EDIT. Отже, замість злиття, принаймні для недовговічних гілок, я думаю, ідея полягає в тому, щоб перебазувати їх на головного. тоді ви отримуєте лінійну історію змін, і вся гілка стає частиною основного стовбура. у цьому випадку у вас є всі зміни, тому вам явно не потрібна копія.


Тож насправді немає сенсу тримати гілку навколо, так?
bstpierre

1
Я настійно рекомендую уникати "перебазування". Переоцінка загалом шкідлива, корисна лише в деяких випадках.
Дітріх Епп

9
Перебазування - цілком розумний робочий процес для ваших місцевих приватних філій. Дуже часто синхронізувати роботу на вищому рівні, наприклад, перебазувати (наприклад, “перебазувати вниз ”). Набагато рідше і, як правило, шкідливо переоцінювати *. Відповідь секунди насправді не має сенсу, тому що незалежно від того, чи ви переоцінюєте або об'єднуєте зміни вгору за течією, вам все одно доведеться якось підштовхувати ці речі. Навіть у вашій локальній гілці вам доведеться об’єднати свою функцію, щоб якось освоїти. Перевага переоцінки ваших функцій полягає в тому, що це злиття стає швидким вперед.
masonk

1
Хоча є на що слід звернути увагу, переробляючи гілки, що нещодавно мене вкусило. Зараз це очевидно, але я ходив місяцями на довгоживучу гілку, завжди переоцінюючи все це проти господаря. Це закінчилося близько 600 приємних, детальних комітів, але майстер був дико реконструйований і повністю змінений приблизно багато разів. Кожен раз перебазуючи всю гілку, я вирізав її старіші коміти від їхнього зв’язку до майстер-комітів, які для них мали сенс. Зараз я набагато віддаю перевагу об'єднанню в master, коли це потрібно. Я буду переоцінювати лише в тому випадку, якщо історія філії це абсолютно не зачепить.
Gary Fixler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.