Mercurial:ブランチの名前を変更できますか?


205

これで、「ステージング」の方がはるかに優れたセマンティックフィットのように思われる「スティギング」ブランチができました。これを処理するための良い戦略は何ですか?

回答:


224

stigingブランチを更新して、そこから新しいブランチを作成します。次に、古いブランチを閉じます。

要約すれば:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

1
これは私が見つけたこれを行うための最良の方法です。ブランチを閉じると、「hgブランチ」の出力に表示されないので、他の人が誤って使用するのを防ぎます。名前がわかっていれば、後でアクセスすることもできます。
器具:2011

2
Mercurialは閉じたブランチの名前を再利用することを許可しますか?つまり、v3ブランチがある場合、上記の手法を使用して、v4に名前を変更し、閉じたv3を残していても、新しい v3ブランチを分岐できますか?
ジョシュアゴールドバーグ

4
@ JoshuaGoldberg、3nochは間違っています。Mercurial 使用すると、閉じたブランチの名前を再利用できます--force。次に例を示しますhg branch --force v3。これにより、必要にhg update v3応じて新しいv3ブランチに更新されます。
ギリ

2
@Giliのコメントとhg helpブランチを確認:「
Joshua Goldberg

7
stiging分岐する前に閉じると、「ルーズエンド」にならない
max.mustermann '13

60

将来の読者のために:rebase拡張機能を使用すると、次のように、同じ親を持つ新しいブランチを作成し、stigingブランチ履歴全体をそのブランチに移動できます。

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

これは、stiging親が1人だけであることを前提としています。もちろん、代わりに明示的なリビジョン番号を使用することもできます。

注1:ブランチstigingに他のブランチとのマージが含まれている場合、同じ親を持つ限り、ブランチが保持されると思います。しかし、私は確かに再確認します。stagingstiging

注2:これにより履歴が編集されるため、古いブランチは複製されたリポジトリから単に消えるだけではありません(rebaseドキュメントを参照)。誰もが新たにクローンを作成できない限り、大規模なグループにとってはあまり実用的なソリューションではないかもしれません。

Note3 / Edit(@JasonRCoombsの好意による):フェーズはmercurialの標準でrebaseあるため、すでにプッシュされた変更セットの変更は拒否されます。フェーズをドラフトに戻して(を使用してhg phases)だますか、古いブランチをそのままにし、適切な名前のコピーを作成します(たとえば、「hg rebase --keep」を使用)。


ユーザーにこれを複製するように強制できる小さなチームの+1は良い考えです-またはhg convert代わりに使用してください。
hochl

5
Mercurialの最新バージョンでは、移動する変更が「パブリック」である場合、rebaseコマンドは「不変のチェンジセットをリベースできません」で失敗します。(hgフェーズを使用して)それらを強制的にドラフト--keepにするか、変更を移動する代わりにコピーするrebaseコマンドに渡します。
Jason R. Coombs 2013年

ステップ4で、: abort: can't rebase immutable changeset 11b1e2b7dc4f。別のブランチのチェンジセットをこのブランチに移植したことに注意してください。その上、分割とマージは無料です。
マークジェロニムス2014

@マーク、上の注3を見てください。
アレクシス2014

6
新しいブランチでチェンジセットをコミットしてからその上にリベースする代わりに、それを省略し.--dest値に使用すると、リベースが自動的に新しいブランチ名を引き継ぎます。
weberc2 14年

16

変更セットがある場合は、ブランチマップで変換拡張機能を使用して名前を変更する必要があります。誰もが新しいリポジトリをクローンするか、古いブランチを取り除く必要があります。


1
これは興味深い解決策ですが、もう少し詳しく説明してもらえますか?
DrM

15

「ステージング」という新しいブランチを作成し、他のブランチを忘れます...


+1それは私がやろうとしていることです。古いチェンジセットは古いブランチ名を持っていますが、新しいチェンジセットは新しいブランチ名を持っています。
barjak

6

これは履歴を変更し、Mercurialの上級ユーザー向けです。意味がわからない場合は、これを行わないでください。

スティグがローカルのみの場合は、グラフトストリップを組み合わせたステージングに変更できます。まず、スティグが分岐した先祖のチェンジセットに更新します。ステージングブランチを作成し、各コミットをステージングからステージングに移植します。ステージングは​​今やスティグのコピーであるべきです。最後に、最初のコミットを取り除いてスティグを破棄します。

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch

1
ステップ3に使用できるhg graft {first changeset in stiging}..{stiging head}
KCD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.