マージコンフリクト:慌てずに理解して解決する
コンフリクトは初心者を怖がらせますが、このセクションを終えると落ち着いて対処できるようになります。コンフリクトが発生する理由(Gitは心が読めないので、どの変更がより重要かを判断できません)、コンフリクトマーカーの読み方、適切な解決方法の選び方を解説します。手動での解決とマージツールの使用という2つのアプローチを紹介します。
- マージコンフリクトの本質を理解し、恐れずに予測可能なものとして扱えるようになります。
- Gitのマーカーを正しく読み取り、手動でコンフリクトを解決できるようになります。
- エディタでマージツールを設定し、視覚的にコンフリクトを解決する方法を学びます。
Simula ng leksyon
3種類のマージコンフリクト
- コンテンツコンフリクト:同じ行への変更
- リネームコンフリクト:ファイルの変更とリネーム
- 削除コンフリクト:一方のブランチで削除、他方で変更
- リネーム関連のコンフリクトはGitでも特に注意が必要
- 不審なコンフリクトはファイルの履歴を確認しましょう
重要なプロジェクト作業中にGitがコンフリクトを報告してきたとします。解決への第一歩は、その種類を理解することです。コンテンツコンフリクトは、異なるブランチで同じ行が変更された場合に発生します。リネームコンフリクトはもっと複雑で、ある開発者がファイル名を変更している間に、別の開発者がその内容を編集しているようなケースです。3つ目は削除コンフリクトで、一方のブランチでファイルが削除され、もう一方のブランチでは変更が加えられている場合です。中でもリネーム関連のコンフリクトは、Gitがファイル名変更後の履歴を正しく追跡できないことが多いため、特に注意が必要です。不審なコンフリクトに遭遇したら、必ずファイルの変更履歴を確認する習慣をつけましょう。
複雑なコンフリクトの構造
- <<<<<<< マーカーは現在のブランチの変更を示す
- ======= が現在の変更とマージ元の変更を分ける
- >>>>>>> がコンフリクトブロックの終端を示す
- git status で問題のあるファイルを一覧表示
- git diff で変更の詳細を確認可能
featureブランチをmainブランチにマージしようとしたらコンフリクトが発生したとしましょう。問題のあるファイルを開くと、特殊なマーカーが表示されます。<<<<<<< HEADと=======の間が現在のブランチ(main)の変更、=======と>>>>>>> featureの間がマージ元ブランチ(feature)の変更です。git statusを使えばコンフリクトしているファイルを一覧表示でき、git diffで詳細な差分を確認できます。これらのマーカーはエラーではなく、どこで意思決定が必要かを示すガイドとして捉えましょう。
#!/bin/bash
# コンフリクト分析スクリプト
echo "テスト用リポジトリを作成中"
mkdir conflict-demo && cd conflict-demo
git init
echo "mainブランチでファイルを作成して最初のコミット"
echo 'Line 1' > file.txt
echo 'Line 2' >> file.txt
git add . && git commit -m '最初のコミット'
echo "featureブランチを作成して1行目を変更"
git checkout -b feature
sed -i 's/Line 1/Line 1 modified in feature/' file.txt
git commit -am 'featureブランチで1行目を修正'
echo "mainブランチに戻って同じ行を変更"
git checkout main
sed -i 's/Line 1/Line 1 modified in main/' file.txt
git commit -am 'mainブランチで1行目を修正'
echo "ブランチをマージ"
git merge feature || echo 'コンフリクト発生!'
echo "\nステータスを確認:"
git status --short
echo "\nコンフリクトファイルを表示:"
cat file.txt
コンフリクト解決の戦略
- 手動編集: マーカーを削除し、必要な部分を残す
- GUIツール: meld, kdiff3で視覚的に比較
- --ours/--theirs: 自分の変更か他者の変更を採用
- rebase時はコミットごとにコンフリクトを解決
- 解決後はgit addとgit commitを忘れずに
コンフリクトが発生したら、いくつかの解決方法があります。ファイルを手動で開いて編集し、マーカーを削除して必要なコードを残すことができます。視覚的に確認したい方は、meldやkdiff3などのツールが便利です。これらは3つのファイルバージョンを同時に表示します。自分の変更を確実に残したい場合はgit checkout --ours、他者の変更を採用する場合は--theirsを使用します。rebase時は特に注意が必要で、リベースする各コミットでコンフリクトが発生する可能性があります。
#!/bin/bash
# resolve_strategies.sh
echo "方法1: 手動での解決"
echo 'ファイルを編集し、コンフリクトマーカーを削除してください'
echo 'その後、次のコマンドを実行: git add file.txt'
echo "\n方法2: 自分のバージョンを採用"
git checkout --ours file.txt
echo "\n方法3: 他者のバージョンを採用"
git checkout --theirs file.txt
echo "\n方法4: マージツールを使用"
echo 'git mergetool --tool=meld'
echo "\n解決方法を選択したら、マージを完了させてください:"
echo 'git commit -m "マージコンフリクトを解決"'
Buong leksyon ay para sa subscription
34 pang slide sa buong bersyon.
Mabubuksan ang video, lahat ng slide, tala, pagsusulit, AI tutor, at interview pagkatapos mag-sign in at mag-subscribe.
Mag-sign in o magparehistro Mag-subscribeNilalaman ng leksyon
- 3種類のマージコンフリクト
- 複雑なコンフリクトの構造
- コンフリクト解決の戦略
- 予防とベストプラクティス
- Gitのマルチラインコンフリクトの読み方
- コンテキストマーカーの解読
- ネストされたコンフリクト: 解決戦略
- 自動化と高度なツール
- 選択戦略: HEADかブランチか?
- 『最も驚きが少ない』原則
- セマンティックコンフリクト: 見えない敵
- ツールと自動化
- ツールの選択:使用場面の見極め
- VS Code:設定と高度な機能
- Beyond Compare:複雑なコンフリクトのシナリオ
- Git Flowと自動化への統合
- .gitattributesによるマージの自動化
- カスタムマージドライバーの作成
- Git rerere — あなたのパーソナルアシスタント
- 高度な自動化戦略
- 大規模チームのためのワークフロー設計
- コンフリクト防止ツールとしてのコードレビュー
- 長期フィーチャーブランチの運用戦略
- コンフリクト解決のためのツールと自動化
- 変更の無条件受け入れの危険性
- 安全なコンフリクト解決の戦略
- マージ後のテスト:確認すべきポイント
- CI/CDとの統合と予防策
- rebaseとmergeのコンフリクトの違い
- --rebase-mergesの活用方法
- 連続するコンフリクト解決の戦略
- 上級テクニックとリベースのデバッグ
- CI/CDを活用した品質管理システム
- GitHub Actions:コンフリクト検証
- Danger-JS:インテリジェントな自動検証
- CI/CDにおける自動マージ競合解決
- マージ競合:不安から自信へ
Mga artikulo tungkol sa araling ito
- git merge: paano pagsamahin ang mga branch at ayusin ang conflict
- Git at GitHub: ano ang pagkakaiba at paano sila magkaugnay
- Paano mag-install ng Git sa Windows, macOS, at Linux
- Ano ang Git at bakit ito kailangan ng developer
- Git Bash: ano ito at paano gamitin sa Windows
Lahat ng leksyon ng kurso
- はじめに:ゼロから始めるGit - 自信を持って使える開発者を目指して
- Gitはなぜ必要なのか?~採用で求められるスキル~
- インストールとセットアップ:Gitの初回起動準備
- 最初のリポジトリ: init、add、commit、そしてインデックスの魔法
- Git履歴の読み方: log, diff, showと過去の履歴を辿る
- ブランチ: コードの並行現実
- ミスをなかったことに:restore、reset、revert ─ 正しい使い方と危険な落とし穴
- GitHubとリモートリポジトリ: クラウドでのコード管理
- チームワーク:フォーク、フィーチャーブランチ、プルリクエスト
- マージコンフリクト:慌てずに理解して解決する
- 実践的なチーム開発におけるGitワークフロー:最適な選択方法
- 上級者向けツール:rebase、stash、cherry-pick、タグ
- 最終プロジェクト:実際のチーム開発をシミュレートする