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もう出力に表示しないようです。

もう1つのヘッドを残さずにマージされたブランチを閉じることは可能ですか?機能ブランチを閉じるためのより正しい方法はありますか?

関連する質問:


@Andrey:しかし、指摘された記事は、「-close-branch」について語っているだけではありません。ブランチをプルーニングする4つの方法を示しています。本当に必要なくなった場合は、記事で説明されているようにクローンを作成できます。唯一の「問題」は、なんらかの理由で閉じたいが、それはそのままにしておきたい場合です。
SyntaxT3rr0r

1
@WizardOfOddsはい、私は枯れた枝の剪定に関する記事全体を読みました。ブランチを破棄せずに、変更履歴に残してほしい。以前は、機能ブランチをdefault「閉じない」でマージしました。その結果、新しいヘッドは0になりましたが、そのようなブランチはhg branches(非アクティブなブランチとして)永久に表示されていました。
Andrey Vlasovskikh 2010

機能を開発するには、リポジトリ全体のクローンを作成し、機能が完成したらリポジトリをマージする傾向があります。履歴に(閉じた)ブランチの残りを残したくありません。
DanMan 2014年

回答:


218

1つの方法は、マージされた機能ブランチを開いたまま(そして非アクティブ)にすることです。

$ 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)

最初のものはより単純ですが、開いたブランチを残します。2つ目は開いたヘッド/ブランチを残しませんが、もう1つの補助コミットが必要です。機能ブランチへの最後の実際のコミットとを使用したこの追加のコミットを組み合わせる--close-branchことができますが、どのコミットが最後のコミットになるかを事前に知っておく必要があります。

更新:Mercurial 1.5以降はいつでもブランチを閉じることができるため、ブランチは両方に表示されなくhg branchesなりhg headsます。あなたをいらいらさせる可能性がある唯一のことは、技術的にはリビジョングラフはまだ子なしでもう1つのリビジョンを持っているということです。

アップデート2:Mercurial 1.8以降、ブックマークはMercurialの中核機能となっています。ブックマークは、名前付きブランチよりもブランチに便利です。この質問も参照してください:


2
とは限りませんBookmarks are more convenient for branching than named branches。HgブックマークはGitブランチと同じではありません。それらは多くのエッジケースでいっぱいで、機能ブランチとしては不適切です。例:リポジトリのクローンを作成すると、defaultブランチの最新のコミットになります。ブックマークを使用する場合、このチェンジセットはランダムな(不安定な)ブックマークに対応します。名前付きブランチを使用する場合、stable / defaultブランチで最新のコミットを取得します。これは通常必要なものです。ブックマークはいつかそこに届くでしょうが、まだそこにはありません。
ギリ2014年

ローカルリポジトリでのみ表示されるプライベートタグとしてブックマークを使用しています。それらは私が再訪する必要があるチェンジセットのリマインダーとして機能します。
ギリ2014年

このアプローチに従ってみましたが、プッシュしようとするとエラーが発生しますabort: push creates new remote branches:。何が悪いのでしょうか?
kasperd

79

閉ざすのを忘れていた枝には2つのケースがあります

ケース1:ブランチがデフォルトにマージされなかった

この場合、ブランチを更新し、-close-branchを使用して別のコミットを実行します。残念ながら、これによりブランチが新しいチップになるため、他のクローンにプッシュする前に、実際のチップがいくつかの変更などを受け取ることを確認しますその奇妙なヒントについて混乱しないでください。

hg up myBranch
hg commit --close-branch

ケース2:ブランチがデフォルトにマージされた

このケースはケース1とそれほど大きな違いはなく、ケース1と2つの追加のステップを再現することで解決できます。

この場合、ブランチのチェンジセットに更新し、-close-branchを使用して別のコミットを実行し、ヒントになった新しいチェンジセットをデフォルトにマージします。最後の操作で、デフォルトのブランチにある新しいヒントが作成されます-HOORAY!

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

これが将来の読者に役立つことを願っています。


3
私のようなMercurial初心者には良い明確な答えです。そして、hg helpのコマンドの1つとしてリストされていない "ci"を使用しないでいただき、ありがとうございます

8
@MB .:そのような場合、hg help ciそれを説明します。
Chris Morgan

'hg merge'コマンドが教えてくれると思いますが、最後にはまだ別のコミットがあります
チップグランディット

11

もう少し編集してください...あなたのコメントを読んで、feature-xチェンジセットを維持したいので、ここでのクローン作成アプローチは機能しません。

それは他の人を助けるかもしれないので、私はまだここで答えを任せます。

「機能X」を完全に削除したい場合は、たとえば機能しなかったため、クローンを作成できます。これは、記事で説明されている方法の1つであり、実際に機能し、特にヘッドについて話します。

私が理解している限り、これがあり、「feature-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

また、次のものが表示され、feature-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-branchフラグと組み合わせることができます(つまり、変更されたファイルをコミットし、ブランチを同時に閉じます)。

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

これですべてです。回転グラフに余分な頭はありません。余分なコミットはありません。


私はそれを私の回答で述べました:「 "--close-branchを使用して、機能ブランチへの最後の実際のコミットとこの追加のコミットを組み合わせることができますが、どのコミットが最後になるかを事前に知っておく必要があります。" " "
Andrey Vlasovskikh 2015年

なるほど、分かりました。文の最後の部分がよくわからないので(「知っておくべきですが...」)、違う意味だと思いました。また、このメソッドはほとんどのGUIツール(TortoiseHG、SourceTreeなど)ではサポートされていないことにも注意してください。
tav

@AndreyVlasovskikhこの回答のポイントは、機能ブランチの最後のコミットではなく、マージでブランチを閉じることです。
kasperd 2015年

@tav mergeコマンドを発行する前hg branchに、マージのブランチ名が開いたままにしておきたいものであることを確認するために使用するのは良い考えです。
kasperd 2015年

2
よく見ると、マージは常に閉じたブランチにあるようです。望ましい結果は、その親の1つのブランチ上にあり、他の親のブランチを閉じることです。それは不可能のようです。したがって、これは結局実行可能なソリューションのようには見えません。残念ながら、ブランチの終了点としてマージを使用したかったのです。
kasperd 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.