【ツール活用|実務向け】Gitのコンフリクト地獄を回避する「git rerere」の活用術

導入

Gitでの開発中、長期間にわたるフィーチャーブランチの運用や、頻繁なrebaseを行っていると、「さっき直したはずのコンフリクトがまた発生した」という経験はないでしょうか。何度も同じ箇所を修正するのは時間の浪費であり、人為的ミスも誘発します。これを解決するのがGitの隠れた名機能「git rerere」です。本記事では、この機能を有効化し、コンフリクト解消のコストを劇的に下げる方法を解説します。

基礎知識

rerereとは「Reuse Recorded Resolution(記録された解決策の再利用)」の略称です。Gitは、一度発生したマージコンフリクトとその修正結果を内部的に記録する能力を持っています。rerereを有効にすると、次に同じパターンでコンフリクトが発生した際、Gitが過去の修正内容を自動的に適用してくれます。特に、トピックブランチを頻繁にmainブランチへ追従させるrebase作業において、その真価を発揮します。

実装/解決策

rerereを利用するための手順は非常にシンプルです。まずは設定を有効化します。

1. 全グローバル設定で有効化する場合
git config –global rerere.enabled true

2. 特定のリポジトリのみで有効化する場合
git config rerere.enabled true

一度有効化すれば、あとはGitが自動的にコンフリクトの解決策を記録します。コンフリクトが発生し、手動でファイルを修正してgit addした瞬間に、その解決策が保存されます。

サンプルプログラム

以下は、rerereがどのように動作し、コンフリクトが自動解決されるかを確認するための手順例です。

1. 準備:rerereを有効化する
git config –global rerere.enabled true

2. コンフリクトが発生する状況を再現し、手動で修正する
(この時、Gitは修正内容を .git/rr-cache に記録する)
git merge feature-branch
… ここでコンフリクトが発生 …
… ファイルを修正して git add を実行 …

3. 再度コンフリクトが発生した際、自動適用されるか確認する
(例えば、rebaseなどで同じ修正が必要な状態にする)
git rebase main
成功すると、以下のメッセージが表示される
“Resolved ‘ファイル名’ using previous resolution.”
これにより、手動修正なしでコンフリクトが解消される

応用・注意点

rerereを活用する上で、現場で知っておくべき注意点がいくつかあります。

・記録の消去
誤った解決策を記録してしまった場合は注意が必要です。その場合は、git rerere forget <ファイル名> を実行することで、記録された解決策を破棄できます。

・自動解決を過信しない
rerereはあくまで「過去の修正パターン」を適用するだけです。コードの文脈が大きく変化している場合、自動適用された修正が論理的に間違っている可能性があります。適用後には必ず git diff やテストコードの実行を行い、意図通りに解決されているか確認する習慣をつけましょう。

・チーム運用
rerereのキャッシュはローカルの .git ディレクトリ内に保存されます。そのため、チームメンバー間での共有はされません。あくまで個人の開発効率を上げるツールとして、積極的に利用することをおすすめします。

コメント

タイトルとURLをコピーしました