Меркурійський хід змінюється на нову гілку


124

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


Відповіді:


153

Як запропонував Марк, MqExtension - це одне рішення для вас. Для IMHO більш простим робочим процесом є використання розширення ребаї . Припустимо, у вас є така історія:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Це означає, що перегляд 0- це основа, над якою ви почали працювати над своєю функцією. 1-2Скажімо, тепер ви хочете змінити названу гілку my-feature. Оновіть до редакції 0та створіть цю гілку:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

Зараз історія виглядає так:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Використовуйте rebaseкоманду для переміщення версій 1-2на версію 3:

$ hg rebase -s 1 -d 3

Результатом цього є наступний графік:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

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


4
Недолік IMHO цього рішення полягає в тому, що він вводить фіктивну фіксацію "запустити нову гілку моєї функції" (тобто таку, яка не змінює жодних файлів).
sschuberth

9
@sschuberth: Я думаю, що тут явна справа. Якщо додатковий набір змін є для вас проблемою, комбінуйте його з наступним (наприклад, використовуючи foldкоманду тепер вбудованого розширення histedit ).
Обен Сонне

6
@AmirRachum: hg log -G( GraphlogExtension ). Я викреслив деякі рядки вручну, але це також могло бути візуалізовано повністю автоматично, використовуючи власні стилі журналу .
Обен Сонне

2
Включити Rebase розширення: mercurial.selenic.com/wiki/RebaseExtension#Configuration
56ka

1
@sschuberth Я згоден. Моє вирішення полягає в тому, щоб перебазувати ваші нереєстраційні комісії на батьківський обліковий запис манекена з прапором --keepbranches, а потім hg зніміть свою фіктивну комісію. Це дуже багато роботи, щоб змінити назву філії, але іноді Mercurial так німий.
weberc2

30

Ви можете використовувати MqExtension . Скажімо, набір змін для переміщення - це версії 1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches

Я хочу імпортувати 63:64 і 66:68. Я отримую ревізію 65, не є батьком 64
Casebash

Що ти хочеш зробити з 65? Mq може конвертувати лише послідовні набори змін із голови. Це перетворює зазвичай незмінні набори змін у змінні патчі, які можна редагувати. Це змінює хеши (які стосуються всіх дітей), тому ви не можете пропустити.
Марк Толонен

У мене є ряд змін (включаючи 65), які я здійснив на головній гілці і натиснув
Casebash

1
Не редагуйте набори змін, які були натиснуті. Mq змінює хеші, щоб вони були ефективно новими наборами змін. Редагуйте лише історію, яку не натискали.
Марк Толонен

Якщо ви вже підштовхнули 65, то вам, безумовно, не слід рухатись 63 і 64, а просто погодитися на переміщення 66:68 (знову ж таки, лише якщо ви їх не натиснули).
Метт

9

Я вважаю за краще рішення патча, описане тут Марком Толонен

Що я маю:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

Що я хочу:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

команди вбивства:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

Ось стан мого локального сховища

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

Тепер мені потрібно видалити версії 1 2 і 3 з моєї гілки за замовчуванням. Це можна зробити за допомогою команди strip з розширення mq. hg stripвидаляє набір змін та всіх його нащадків із сховища.

Увімкніть розширення, додавши у файл конфігурації наступні рядки (.hgrc або Mercurial.ini):

vim ~/.hgrc і додати:

[extensions]
mq =

А тепер зніміть цей сховище на версії 1.

hg strip 1

і ось ми

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

Примітка: набори змін різні, але версії однакові


5

Для тих, хто схильний використовувати графічний інтерфейс

  1. Перейдіть до Tortoise Hg-> File-> Settingsі поставте галочку rebase.

введіть тут опис зображення

  1. Перезапустіть інтерфейс черепахи

  2. Створіть нову гілку, де ви будете рухати зміни. Клацніть на поточну назву відділення -> select Open a new named branch-> виберіть назву гілки.

введіть тут опис зображення

  1. Якщо змін, які ви хочете перемістити, не було внесено public(наприклад draft), перейдіть до 5. (Якщо зміни вже були опубліковані, і ви не старший розробник, вам слід поговорити з ким-небудь старшим (отримати козла відпущення), оскільки ви можете накрутити речі на великі терміни , Я не беру на себе жодної відповідальності :)).

Перейдіть до View-> Show Console(або Ctrl+ L), тоді запишіть у консоль hg phase -f -d 2- де 2 найнижча версія, ви переходите до нової гілки.

  1. Перейдіть до гілки та перегляду (має бути найвищою версією, якщо ви переміщуєте зміни до нової гілки, створеної на кроці 3.) Right Mouse->Update

  2. Перейдіть до гілки і перейдіть, коли ви будете переміщувати зміни з Right Mouse-> Modify History->Rebase

введіть тут опис зображення

  1. Клацніть Rebaseі моліться, щоб не було конфліктів, зливайтеся, якщо потрібно.

  2. Натисніть на зміни, на даний момент все зміни повинні бути draft.

  3. Перейдіть до найвищої версії в галузі, в яку ви рухали зміни Right Mouse-> Change Phase to-> Public.

введіть тут опис зображення

Сподіваюсь, це заощадить певний час.


Чудова робота! Ви хочете спробувати це, лише одне питання - чому в кінці змінити фазу на загальнодоступну? "Будь-які набори змін, які можна побачити у віддаленому сховищі, є загальнодоступними", тож коли ви натискаєте, чи все-таки це не буде встановлено для загального доступу?
Джошуа Дуксбері

@JoshLeeDucks При натисканні вони більше не змінюються publicавтоматично (принаймні, для мене вони цього не роблять).
Матас Вайткевічус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.