Mercurial を使用して、そのブランチからの最後のマージ以降、ブランチをマージすることによって適用されたすべての変更セットを一覧表示するにはどうすればよいですか?
2 に答える
Revsets はあなたの友達です。または、それらがどれほど複雑になるかに応じて、あなたの宿敵:)
次のコマンドは、最後の 2 つのマージの間に関連付けられたすべての変更セットを表示します。
$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge()))"
この複雑で小さな式 (後で簡単にする方法について説明します) は、次のことを行います。
x:y
x
間のすべての変更セットを提供しますy
。merge()
すべてのマージを含む revset です。last(...,n)
セットの最後の n 個のチェンジセットを与えます。n
デフォルトは 1ですfirst(...)
セットの最初の変更セットを提供しますancestors(last(merge()))
最後のマージのすべての祖先を含むセットです
これらすべてを組み合わせると、上記の式は次のようになります (read?): 最後の 2 つのマージの最初のマージと最後のマージの間のすべての変更セットを提供してください。
このancestors(...)
ビットは、関係のない変更セットを除外します。
を追加することで、これを特定のブランチの変更に制限できます& branch(branchname)
。たとえば、release
からのブランチにマージする場合は、次のdefault
ようにすることができます。
$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge())) & branch(default)"
実際のマージはrelease
ブランチに表示されるため、これには含まれません。
うまくいけば、これは理にかなっている - 今日の午後、もっと簡単な方法が得られるかどうかを見ていきますが、それが最初に思い浮かびます. それまでの間、これを使用する場合は、ユーザーの hgrc ファイルに revset エイリアスを作成することで簡単にすることができます:
[revsetalias]
contrib = first(last(merge(),2)):last(merge()) & ancestors(last(merge()))
したがって、次を使用できます。
$ hg log -r "contrib"
$ hg log -r "contrib & branch(default)"
詳細については、をご覧くださいhg help revsets
。
icabod のソリューションが正しいかどうかはわかりません。説明できるかどうか見てみましょう。
この変化グラフを見てみましょう。
o----A1----A2----M1--------A3---M2
\ / /
---B1----B2--- /
\ /
----C1--------C2----C3
B
は からの分岐o
で、C
は からの分岐B1
です。M2 で icabod のコマンドを実行すると、次のようになります。
last(merge())
はM2
first(last(merge(),2))
はM1
したがって、式は次のようになります。
hg log -r "M1:M2 & ancestors(M2)"
M1:M2
M1
は、との間のリビジョン番号を持つ変更でM2
あり、この場合は&でありA3
、を完全に無視します。C2
C3
C1
M1 の祖先ではなく、M2 の祖先のセットを探していると思います。すなわち
hg log -r "ancestors(M2) & not ancestors(M1)"
また
hg log -r "ancestors(last(merge())) and not ancestors(first(last(merge(), 2)))"
C1
これは, C2
, C3
&であるべきだと思いますA3
。また、いつ、どのように変更セットがリポジトリに追加されたかを気にしないという利点もあります。
これに関する唯一の問題は、最後から 2 番目のマージが最新のマージの祖先でない場合です。これは読者の演習として残しておきます ;-)
もちろん、マージを実行する前にhg merge --preview
(または-P
) を実行することで、これらすべてを回避できます。マージを実行するときに含まれるすべての変更セットが一覧表示されます。