マージコンフリクト:慌てずに理解して解決する
コンフリクトは初心者を怖がらせますが、このセクションを終えると落ち着いて対処できるようになります。コンフリクトが発生する理由(Gitは心が読めないので、どの変更がより重要かを判断できません)、コンフリクトマーカーの読み方、適切な解決方法の選び方を解説します。手動での解決とマージツールの使用という2つのアプローチを紹介します。
- マージコンフリクトの本質を理解し、恐れずに予測可能なものとして扱えるようになります。
- Gitのマーカーを正しく読み取り、手動でコンフリクトを解決できるようになります。
- エディタでマージツールを設定し、視覚的にコンフリクトを解決する方法を学びます。
Phần đầu bài giảng
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 "マージコンフリクトを解決"'
Bài giảng đầy đủ dành cho thuê bao
Còn 34 slide nữa trong phiên bản đầy đủ.
Video, toàn bộ slide, ghi chú, bài kiểm tra, gia sư AI và phỏng vấn sẽ mở sau khi đăng nhập và đăng ký thuê bao.
Đăng nhập hoặc đăng ký Đăng ký thuê baoNội dung bài giảng
- 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における自動マージ競合解決
- マージ競合:不安から自信へ
Bài viết liên quan đến bài học này
- git merge: cách gộp nhánh và xử lý xung đột
- Git và GitHub: khác nhau thế nào và liên hệ ra sao
- Cách cài đặt Git trên Windows, macOS và Linux
- Git là gì và vì sao lập trình viên cần nó
- Git Bash: đó là gì và cách dùng trên Windows
Tất cả bài giảng của khóa học
- はじめに:ゼロから始めるGit - 自信を持って使える開発者を目指して
- Gitはなぜ必要なのか?~採用で求められるスキル~
- インストールとセットアップ:Gitの初回起動準備
- 最初のリポジトリ: init、add、commit、そしてインデックスの魔法
- Git履歴の読み方: log, diff, showと過去の履歴を辿る
- ブランチ: コードの並行現実
- ミスをなかったことに:restore、reset、revert ─ 正しい使い方と危険な落とし穴
- GitHubとリモートリポジトリ: クラウドでのコード管理
- チームワーク:フォーク、フィーチャーブランチ、プルリクエスト
- マージコンフリクト:慌てずに理解して解決する
- 実践的なチーム開発におけるGitワークフロー:最適な選択方法
- 上級者向けツール:rebase、stash、cherry-pick、タグ
- 最終プロジェクト:実際のチーム開発をシミュレートする