Mercurialの移動による新しいブランチへの変更


124

ローカルリポジトリにコミットした変更がいくつかありますが、まだプッシュされていません。機能が予想よりも時間がかかるため、プッシュする前に、これらの変更を名前付きブランチにスワップしたいと思います。これどうやってするの?


回答:


153

Markが提案したように、MqExtensionは問題の解決策の1つです。私見の簡単なワークフローは、リベース拡張を使用することです。次のような履歴があるとします。

@  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
このソリューションの欠点は、「新しいブランチのmy-featureを開始する」ダミーコミット(つまり、ファイルを変更しないもの)が導入されることです。
sschuberth

9
@sschuberth:ここでは露骨であることは良いことだと思います。追加のチェンジセットが問題である場合は、それを後続のチェンジセットと組み合わせます(たとえばfold、現在組み込まれているhistedit拡張機能のコマンドを使用して)。
Oben Sonne

6
@AmirRachum:hg log -GGraphlogExtension)。手動で一部の行を削除しましたが、カスタムログスタイルを使用して完全に自動的にレンダリングすることもできます
Oben Sonne

2
リベース拡張を有効にする: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はヘッドからの連続したチェンジセットのみを変換できます。通常は不変のチェンジセットを編集可能な変更可能なパッチに変換します。これはハッシュを変更し(すべての子に影響する)、スキップできません。
Mark Tolonen、2011年

mainブランチでいくつかの変更(65を含む)を加えてプッシュしました
Casebash

1
プッシュされたチェンジセットは編集しないでください。Mqはハッシュを変更して、事実上新しいチェンジセットになるようにします。プッシュされていない履歴のみを編集します。
Mark Tolonen、2011年

すでに65をプッシュしている場合は、63と64を移動せず、66:68を移動するだけで十分です(ここでも、プッシュしていない場合のみ)。
Matt

9

私はここでMark Tolonenが説明するパッチソリューションを好む

私が持っているもの:

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を削除する必要があります。mqの拡張機能からstripコマンドを使用してこれを行うことができます。 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

GUIを使いたい方

  1. Tortoise Hg-> File->に移動してSettings、チェックマークを付けrebaseます。

ここに画像の説明を入力してください

  1. 亀のUIを再起動します

  2. 変更を移動する新しいブランチを作成します。現在のブランチ名をクリック->選択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

ここに画像の説明を入力してください

これにより時間を節約できることを願っています。


よくやった!これを試すつもりですが、1つの質問だけです-なぜフェーズを最後にパブリックに変更するのですか 「リモートリポジトリで見られるチェンジセットはすべて公開されている」ので、プッシュすると、とにかく公開に設定されませんか?
Joshua Duxbury 2016年

@JoshLeeDucksプッシュしても、public自動的に変更されません(少なくとも私にとっては変更されません)。
Matas Vaitkevicius
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.