概要
- Jujutsu の中上級ユーザーや Git ユーザー向けの内容
- megamerge ワークフローの概要と利点を解説
- octopus merge (複数親マージ)の活用法
- 作業効率化 ・コンフリクト削減・ブランチ管理の簡便化
- 便利なコマンドやエイリアス の紹介と設定例
Jujutsu「megamerge」ワークフローとは
- megamerge は、複数の作業ブランチを一つの octopus merge commit (複数親マージコミット)でまとめる手法
- 各種バグ修正、機能追加、他人のブランチ、ローカル環境用変更など、 全ての作業ブランチを一つのmegamergeに集約
- megamerge自身はpushしない。構成する各ブランチのみをpush対象とする運用
- 作業コピーが正常動作すれば、全変更の相互作用も保証 される安心感
- Jujutsu ではコンフリクトが一級市民のため、 マージ時の衝突も最小限 に抑えられる
megamergeワークフローの主な利点
- 全作業の合算状態 で常に開発できるため、 切り替え作業の負担が激減
- 小さなPRの作成やドライブバイ修正 が容易
- ブランチの最新化 も、megamergeごとまとめて単一リベースで対応可能
- 複数作業の同時進行 が自然に可能となる運用設計
megamergeの作り方と使い方
- 新規megamerge作成 は、含めたい各ブランチを親にして空コミットを作成
- 例:
jj new x y z→jj commit --message "megamerge"
- 例:
- megamerge上でWIP(作業中)コミットを積み上げる。必要に応じて分割や新規ブランチ化も柔軟
- 既存コミットへの変更吸収 は
squash --toやabsorbコマンドで自動化jj squash --to x --from y --interactivejj absorb --from x
- 新規コミットの追加 や 別ブランチへの移動 は
rebaseとbookmark moveで調整jj rebase --revision x --after y --before megamergejj bookmark move --from y --to x
エイリアス設定例と運用Tips
- エイリアスで複雑な操作を簡略化
[revset-aliases]closest_merge(to):指定コミット近傍の最新マージコミット取得
[aliases]stack:任意のリビジョンセットをmegamerge下に再配置stage:megamerge以降の全変更を一括で再配置restack:trunk()に自分の変更のみリベース
- エイリアス例
jj stack x::y:複数の変更をmegamergeに取り込むjj stage:megamerge以降の全スタックを一括で取り込むjj restack:自分が管理するコミットのみtrunk()へリベース
他開発者との協調・メンテナンス
- 他人のブランチや未管理ブックマークは自動リベース対象外
restackエイリアスで 自分が管理可能なコミットのみを安全にリベース- 複数人・巨大megamergeにも対応可能な運用
TL;DR & 便利コマンドまとめ
- megamerge は 複数作業の同時進行 ・ マージ地獄回避 に最適
- エイリアス設定 で効率的な運用が可能
- absorb や squash --interactive で既存コミットへの変更集約
- rebase や stack/stage で新規コミットや複数変更の管理が簡単
- megamergeはpush対象ではなく、ローカル作業の効率化ツール
主なコマンド例
- 既存コミットへの変更吸収
jj absorbjj squash --to x --interactive
- 新規コミットの追加
jj rebase --revision y --after x
- megamergeへの一括追加
jj stage
- 特定リビジョンセットの追加
jj stack w::z
- trunk()へのリベース
jj restack
megamerge ワークフローは、複雑な開発環境や多数の並行作業が発生する現場で、 Jujutsu の真価を発揮する強力な手法。 効率的なブランチ管理 と 衝突回避 を両立したい方におすすめ。