マージコンフリクトという避けられない摩擦
git pull の直後に現れる <<<<<<< の並びを見て、思わずため息が出る。チーム開発で同じファイルを複数人が触れば、マージコンフリクトは避けて通れません。マーカーを一つずつ目で追って解決する作業は、時間を奪うだけでなく、取り違えというミスも招きます。
Antigravity の AI エージェントは、両ブランチの変更が何を意図していたかを読み取り、その意図を保ったまま解決案を示してくれます。実際の解決フローを、手を動かしながら順に追っていきます。
この記事で学べること:
- Antigravity の AI を活用したコンフリクト解決の基本フロー
- Diff View を使ったコンフリクト内容の視覚的な確認方法
- 複雑なコンフリクトを段階的に解決するテクニック
- チーム開発でコンフリクトを予防するベストプラクティス
Git コンフリクトが発生する仕組みと AI 解決のメリット
Git のコンフリクトは、同じファイルの同じ行を2つ以上のブランチで変更した場合に発生します。従来の手動解決では、開発者が両方の変更内容を読み取り、どちらを採用するか(あるいは両方を統合するか)を判断する必要がありましました。
Antigravity の AI エージェントを活用すると、以下のメリットがあります。
- コンテキスト理解: AI がファイル全体のコンテキストを把握し、変更の意図を推測して最適な統合案を提示
- 型安全性の維持: TypeScript や型付き言語の場合、型の整合性を保ったまま解決
- テストの考慮: 既存テストとの整合性を考慮した解決策の提案
- 一括処理: 複数ファイルにまたがるコンフリクトも効率的に処理
Antigravity でコンフリクトを解決する基本フロー
ステップ 1: コンフリクトの発生を確認する
まず、マージやリベースを実行してコンフリクトが発生した状態を確認します。
# feature ブランチを main にマージ
git merge feature/user-auth
# コンフリクトが発生した場合の出力例
# Auto-merging src/lib/auth.ts
# CONFLICT (content): Merge conflict in src/lib/auth.ts
# Auto-merging src/components/LoginForm.tsx
# CONFLICT (content): Merge conflict in src/components/LoginForm.tsx
# Automatic merge failed; fix conflicts and then commit the result.
# コンフリクトファイルを一覧表示
git diff --name-only --diff-filter=U
# 出力例:
# src/lib/auth.ts
# src/components/LoginForm.tsxステップ 2: Antigravity の AI エージェントに解決を依頼する
Antigravity のチャットパネルを開き、コンフリクトの解決を依頼します。
プロンプト例:
「git merge で src/lib/auth.ts と src/components/LoginForm.tsx にコンフリクトが
発生しました。両方の変更を統合して解決してください。main ブランチ側は認証ロジックの
リファクタリング、feature ブランチ側は OAuth プロバイダーの追加です。」
AI エージェントは以下のように動作します。
- コンフリクトマーカーを含むファイルを解析
- 両方のブランチの変更内容と意図を理解
- 最適な統合コードを生成
- Diff View で変更内容を提示
ステップ 3: Diff View で解決内容を確認する
Antigravity の Diff View を使うと、AI が提案した解決内容を視覚的に確認できます。コンフリクト解決前後の差分が色分けして表示されるため、変更の妥当性を素早く判断できます。
Diff View の詳しい操作方法については、Antigravity Diff View 上級ガイド も参照してください。
複雑なコンフリクトを段階的に解決するテクニック
パターン 1: 構造的な変更が競合するケース
関数のシグネチャ変更とロジック追加が同時に行われた場合の解決例です。
// コンフリクト発生前(main ブランチの変更)
// 関数シグネチャのリファクタリング
export async function authenticateUser(
credentials: AuthCredentials,
options?: AuthOptions
): Promise<AuthResult> {
const { email, password } = credentials;
// ... 認証ロジック
}
// コンフリクト発生前(feature ブランチの変更)
// OAuth プロバイダーの追加
export async function authenticateUser(
email: string,
password: string,
provider?: OAuthProvider
): Promise<User | null> {
if (provider) {
return await oauthLogin(provider);
}
// ... 既存の認証ロジック
}
// AI が提案する統合コード
export async function authenticateUser(
credentials: AuthCredentials,
options?: AuthOptions & { provider?: OAuthProvider }
): Promise<AuthResult> {
// OAuth プロバイダーが指定されている場合
if (options?.provider) {
const user = await oauthLogin(options.provider);
return { success: true, user, method: 'oauth' };
}
const { email, password } = credentials;
// ... リファクタリング後の認証ロジック
return { success: true, user, method: 'credentials' };
}パターン 2: インポート文の競合
複数のブランチで異なるモジュールを追加した場合、AI は両方のインポートを統合します。
// AI が自動で統合するインポート文の例
// main ブランチのインポート + feature ブランチのインポートを統合
// Before(コンフリクト状態)
<<<<<<< HEAD
import { validateEmail, hashPassword } from '@/lib/security';
import { RateLimiter } from '@/lib/rate-limit';
=======
import { validateEmail } from '@/lib/validators';
import { OAuthClient } from '@/lib/oauth';
>>>>>>> feature/user-auth
// After(AI による解決)
import { validateEmail, hashPassword } from '@/lib/security';
import { RateLimiter } from '@/lib/rate-limit';
import { OAuthClient } from '@/lib/oauth';パターン 3: 設定ファイルの競合
package.json や tsconfig.json などの設定ファイルは、JSON 構造を壊さないように慎重な統合が必要です。Antigravity の AI はファイル形式を理解しているため、構文エラーのない統合を行います。
プロンプト例:
「package.json のコンフリクトを解決してください。
両方の依存関係を追加し、バージョンが競合する場合は新しい方を採用してください。」
コンフリクト解決後の検証
AI が解決したコードは、必ず以下の手順で検証しましょう。
# 1. 型チェック(TypeScript プロジェクトの場合)
npx tsc --noEmit
# 期待出力: エラーなし
# 2. テストの実行
npm test
# 期待出力: All tests passed
# 3. リントチェック
npm run lint
# 期待出力: No warnings or errors
# 4. 解決を確定してコミット
git add .
git commit -m "Merge feature/user-auth: 認証リファクタリングとOAuth統合"検証でエラーが見つかった場合は、Antigravity のチャットにエラーメッセージを貼り付けて修正を依頼できます。AI はエラーの原因を特定し、コンフリクト解決の修正案を再提案します。
デバッグの詳細なテクニックについては Antigravity AI デバッグガイド を参照してください。
チーム開発でコンフリクトを予防するベストプラクティス
コンフリクトの解決も大切ですが、そもそもコンフリクトの発生を減らすことが最も効率的です。
ブランチ戦略の最適化: 短期間で小さなブランチをマージする方針にすると、コンフリクトの発生頻度と規模を抑えられます。feature ブランチは3日以内にマージすることを目標にしましょう。
こまめなリベース: git rebase main を定期的に実行して、feature ブランチを最新の main に追従させます。小さなコンフリクトをこまめに解決する方が、最後にまとめて解決するよりも明確に楽です。
ファイル分割の徹底: 1つのファイルに多くの機能を詰め込むと、コンフリクトが発生しやすくなります。関心の分離を意識して、1ファイル1機能を心がけましょう。
コードオーナーシップの設定: GitHub の CODEOWNERS ファイルを活用して、特定のファイルやディレクトリの責任者を明確にします。これにより、同じファイルを複数の開発者が同時に変更するケースを減らせます。
Git ワークフロー全般のベストプラクティスは Antigravity での Git ワークフロー で詳しく解説しています。
まとめ
Antigravity の AI エージェントを活用することで、Git コンフリクトの解決は大幅に効率化できます。コンテキストを理解した統合提案、Diff View による視覚的な確認、型安全性やテストを考慮した解決策の生成など、手動解決では難しかった品質の高いコンフリクト解決が可能になります。
ポイントは、AI の提案を鵜呑みにせず必ず検証すること、そしてコンフリクトの予防策も併せて実践することです。短いブランチ寿命、こまめなリベース、ファイルの適切な分割を心がけて、快適なチーム開発を実現してください。