「Stacked Pull Requests」という名の悪夢
厳格なCI/CDプロセスを持つ大規模なプロジェクトで作業していると、一連のPull Request(Stacked PRs)の板挟みになった経験があるはずです。機能Aを開発中ですが、機能Bは動くためにAのコードを必要とし、さらに機能CはBを待たなければならない、といった状況です。
レビュアーから機能Aのロジック修正を求められるまでは、すべてが順調です。しかし、そこからRebaseの悪夢が始まります。Aを修正し、必死にBをAの上にRebaseし、さらにCをBの上に引き上げる。git rebase –ontoコマンドで一瞬でも気を抜くと、コミット履歴全体がめちゃくちゃになってしまいます。
私自身、5つの依存ブランチの絡まりを解くためだけに午前中を丸々潰したことがあります。疲れ果てて、誤って<a href="https://itfromzero.com/ja/git-ja/github%e3%81%a8gitlab%e3%81%aebranch-protection-rules%e8%a8%ad%e5%ae%9a%ef%bc%9a%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%ac%e3%83%93%e3%83%a5%e3%83%bc%e3%82%92%e3%82%b9%e3%82%ad%e3%83%83%e3%83%97%e3%81%95.html">git push --force</a>を実行し、同僚のコードを上書きしてしまったことさえあります。そんな「ヒヤッとする」場面をなくすために、私はgit-macheteを使い始めました。
なぜ従来のブランチ管理は「壊れ」やすいのか?
パフォーマンスの違いを理解するために、2つの一般的なアプローチを見てみましょう。
1. 手動Rebase(苦行のような方法)
これはデフォルトの方法です。各ブランチに対して一つずつgit rebaseコマンドを使用します。
- デメリット: コンフリクトが発生した場合、3つのブランチの連鎖だけで平均10〜15分かかります。ブランチの数が増えると、各ブランチのベース(親)を間違えやすくなります。
2. git-macheteを使用する(スマートな方法)
このツールはGitの上位に管理レイヤーを作成し、.git/macheteにある設定ファイルを通じて依存関係ツリーを定義します。
- メリット: たった1つのコマンドで連鎖全体を更新できます。頭の中で記憶しておく必要がなく、リポジトリの全景を把握できます。
「可視化」能力 — git-macheteの究極の武器
このツールの最大の魅力はgit machete statusコマンドです。どのブランチが古いのか分からず不安になる代わりに、明確なツリー図が表示されます。同期されているブランチ(緑色)、ズレが生じているブランチ(赤色)、 Vivそしてマージ済みのブランチ(灰色)が一目でわかります。
これにより、--force-with-leaseを使う際も自信が持てます。プッシュするたびに推測して祈るのではなく、依存関係の連鎖の中のどこに自分がいるのかを常に正確に把握できます。
30秒で完了するインストール
このツールはPythonで書かれているため、あらゆるオペレーティングシステムで非常に簡単にインストールできます。
# macOSの場合
brew install git-machete
# Ubuntu/LinuxまたはWindowsの場合(pip経由)
pip install git-machete
インストールが完了したら、リポジトリに移動して以下のコマンドを実行し、ツールにブランチ構造を自動的に「学習」させます。
git machete discover
作業を楽にする実践的な操作
1. ブランチ連鎖の「健康状態」を確認する
このコマンドは、毎朝仕事を始める際の習慣にすべきです:
git machete status
ブランチが赤色で表示されている場合、それは親ブランチからコードを更新する必要があるという合図です。
2. 一括自動Rebase
例えば、masterブランチに大きな更新があったとします。feature-1 -> feature-2 -> feature-3という連鎖全体もそれに合わせて更新したい場合は、次のように入力するだけです:
git machete update
