Як правильно закрити гілку функції в Mercurial?


240

Я закінчив працювати над галуззю feature-x. Я хочу об'єднати результати назад у defaultгілку та закрити feature-x, щоб позбутися від неї у виході hg branches.

Я придумав такий сценарій, але він має деякі проблеми:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

Таким чином, feature-xгілка (changests 40- 41) закрита, але є одна нова голова , закриваючий набір змін 44, який буде перерахований hg headsщоразу:

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

Оновлення : Схоже, що з версії 1.5 Mercurial більше не показує заголовків закритих гілок у висновку hg heads.

Чи можна закрити об'єднану гілку, не залишаючи ще однієї головки? Чи є більш правильний спосіб закрити гілку функції?

Пов’язані запитання:


@Andrey: але зазначена стаття НЕ говорить лише про "--close-branch". Він показує чотири способи обрізати свою гілку. Якщо ви насправді цього більше не хочете, можете клонуватись, як пояснено в статті. Єдина «проблема» полягає в тому, що якщо з якоїсь причини ви хочете її закрити, все ж тримайте її.
SyntaxT3rr0r

1
@WizardOfOdds Так, я прочитав всю статтю про обрізку мертвих гілок. Я хочу, щоб галузь залишилася в історії ревізії, а не викидала її. Раніше я просто об'єднував гілки функцій у default"не закриваючи" їх. Це призвело до появи нових голов, але такі гілки були помітні hg branchesназавжди (як неактивні гілки).
Андрій Власовських

Для розвитку функцій я схильний клонувати ціле сховище, а потім об'єднати його, як тільки функція буде закінчена. Мені не подобається, що в історії залишаються залишки (закритих) гілок.
DanMan

Відповіді:


218

Один із способів - просто залишити об'єднані гілки функцій відкритими (і неактивними):

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

Ще один спосіб - закрити гілку функції перед об'єднанням за допомогою додаткового комітету:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

Перший простіший, але він залишає відкриту гілку. Другий не залишає відкритих головок / гілок, але це потребує ще одного допоміжного комітету. Можна поєднувати останнє фактичне присвоєння до гілки функцій із цим додатковим коміксом, використовуючи --close-branch, але слід заздалегідь знати, який комітет буде останнім.

Оновлення : з Mercurial 1.5 ви можете закрити відділення в будь-який час, щоб воно не з’являлося в обох hg branchesі hg headsбільше. Єдине, що може вас дратувати, - це те, що в технічному відношенні графік перегляду все ще матиме ще одну ревізію без дітей.

Оновлення 2 : Оскільки закладки Mercurial 1.8 стали основною особливістю Mercurial. Закладки зручніші для розгалуження, ніж названі гілки. Дивіться також це питання:


2
Не обов’язково це правда Bookmarks are more convenient for branching than named branches. Hg закладок - це не те саме, що гілки Git. Вони переповнені безліччю крайових випадків, які роблять їх непридатними як функції гілок. Наприклад: коли ви клонуєте сховище, ви отримаєте останню команду у defaultфілії. Якщо ви використовуєте закладки, цей набір змін відповідає випадковій (нестабільній) закладці. Якщо ви використовуєте названі гілки, ви отримаєте останню фіксацію в стабільній / за замовчуванням гілці, яка зазвичай є тим, що вам потрібно. Закладки потраплять туди одного дня, але їх поки немає.
Гілі

Я використовую закладки як приватні теги, які видно лише в моєму локальному сховищі. Вони діють як нагадування про набори змін, які мені потрібно переглянути.
Гілі

Я намагався слідувати цьому підходу, але я все ще отримую помилку при спробі натискання: abort: push creates new remote branches:. Що я міг зробити неправильно?
kasperd

79

Імхо, є два випадки для гілок, які забули закрити

Випадок 1: гілка не була об'єднана за замовчуванням

у такому випадку я оновлююсь до гілки та роблю ще одну фіксацію з --close-branch, на жаль, це вибирає гілку, щоб вона стала новою підказкою, а отже, перед тим, як натиснути її на інші клони, я переконуюсь, що справжній наконечник отримує ще деякі зміни та інші не плутайтеся з приводу цієї дивної поради.

hg up myBranch
hg commit --close-branch

Випадок 2: відділення було об'єднано за замовчуванням

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

у цьому випадку я оновлююся до набору змін гілки, виконую ще одну фіксацію з --close-branch та об'єдную новий набір змін, який став підказкою за замовчуванням. остання операція створює нову підказку, яка знаходиться у гілці за замовчуванням - HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

Сподіваюся, що це допомагає майбутнім читачам.


3
Хороша чітка відповідь для такого новачка, як я. І дякую, що не використовуєте "ci", який не вказаний як одна з команд hg help, тому я не знаю, що це означає :)
МБ.

8
@MB .: у таких випадках hg help ciпояснюватиме це вам.
Кріс Морган

Я вірю, як скаже вам команда 'hg merge', ще в кінці є ще одна фіксація
Chip Grandits

11

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

Я все одно дозволю відповіді тут, бо це може допомогти іншим.

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

Наскільки я розумію, у вас це є і хочеться раз і назавжди позбутися голови "особливості-х":

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Отже, ви робите це:

hg clone . ../cleanedrepo --rev 7

І у вас з’явиться таке, і ви побачите, що функція-x справді зникла:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Я, можливо, неправильно зрозумів, що ви хотіли, але, будь ласка, не відмовляйтесь, я знадобився час, відтворюючи ваш випадок використання:)


7

Дивно, що ніхто ще не запропонував найбільш надійний спосіб закриття повнометражних гілок ... Ви можете просто об'єднати злиття зробити з прапором --close-гілки (тобто зробити змінені файли і закрийте гілки одночасно):

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

Отже, це все. Жодної зайвої голови на ревграф. Без зайвих комісій.


Я згадував це у своїй відповіді: "" "Можна поєднувати останню фактичну прив'язку до функції гілки з цією додатковою фіксацією, використовуючи --close-гілка, але слід заздалегідь знати, яка команда буде останньою." " "
Андрій Власовських

Добре, я бачу. Я просто не дуже розумію останню частину речення ("але треба знати ..."), тому я подумав, що це означає щось інше. Також хотілося б зазначити, що цей метод не підтримується більшістю інструментів графічного інтерфейсу (TortoiseHG, SourceTree тощо).
тав

@AndreyVlasovskikh Суть цієї відповіді полягає в закритті гілки в злитті, а не в останньому комітеті гілки функції.
kasperd

@tav Перед тим, як видавати mergeкоманду, може бути корисним використовувати hg branchдля перевірки того, що назва гілки об'єднання є тією, яку ви хочете залишати відкритою.
kasperd

2
При ближчому розгляді, схоже, злиття завжди буде на закритій гілці. Бажаним результатом буде те, що він знаходиться на гілці одного з батьків і закриває гілку іншого батька. Здається, це неможливо. Отже, це не виглядає як прийнятне рішення. Шкода, я дуже хотів використовувати злиття як точку закриття гілки.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.