web-dev-qa-db-ja.com

Mercurialで機能ブランチを正しく閉じる方法は?

機能ブランチ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)は閉じられますが、1つの新しいheadがあり、閉じるブランチのチェンジセット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
|

Update:バージョン1.5以降、Mercurialはhg headsの出力に閉じたブランチのヘッドを表示しなくなったようです。

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

関連する質問:

237

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を使用して、機能ブランチへの最後の実際のコミットとこの追加のコミットを組み合わせることができますが、どのコミットが最後のものになるかを事前に知る必要があります。

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

Update 2:Mercurial 1.8bookmarksがMercurialのコア機能になったため。ブックマークは、名前付きブランチよりもブランチングに便利です。この質問もご覧ください。

217

私見閉鎖するのを忘れていたブランチの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

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

79
Nachbars Lumpi

EDIT残念、遅すぎる... feature-xチェンジセットを保持したいというコメントを読んでいるので、ここでのクローン作成アプローチは機能しません。

他の人にも役立つかもしれないので、ここで答えを残しておきます。

たとえば、機能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

私はあなたが望むものを誤解したかもしれませんが、改造しないでください、私はあなたのユースケースを再現するのに時間がかかりました:)

11
SyntaxT3rr0r

機能ブランチを閉じる最も堅牢な方法をまだ誰も提案していないのは奇妙です... combineコミットを--close-branchフラグとマージするだけです(つまり、変更されたファイルをコミットして、同時に分岐):

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

それですべてです。 revgraphに余分な頭はありません。余分なコミットはありません。

7
tav