今回やること
この記事では、学習用リポジトリで意図的にコンフリクトを起こし、解決します。
コンフリクトはエラーではなく、Gitが「どちらを採用するか人間に確認している状態」です。
前提条件
- Gitリポジトリがある
- 作業内容を失ってよい学習用環境で試す
git statusが使える
Step 1: ファイルを用意する
echo "title: Git Practice" > memo.txt
git add memo.txt
git commit -m "docs: add memo"
Step 2: ブランチを作る
git switch -c feature/change-title
同じ行を変更します。
echo "title: Feature Title" > memo.txt
git add memo.txt
git commit -m "docs: update title in feature"
Step 3: main側でも同じ行を変更する
git switch main
echo "title: Main Title" > memo.txt
git add memo.txt
git commit -m "docs: update title in main"
Step 4: mergeしてコンフリクトを起こす
git merge feature/change-title
同じ行を別々に変更したため、コンフリクトが起きます。
Step 5: 状態を確認する
git status
コンフリクトしているファイルが表示されます。
Step 6: ファイルを開いて直す
memo.txt には、次のような印が入ります。
<<<<<<< HEAD
title: Main Title
=======
title: Feature Title
>>>>>>> feature/change-title
どちらを残すか、または両方を組み合わせるかを人間が決めます。
title: Merged Title
コンフリクトの印を残さないようにします。
Step 7: 解決をGitに伝える
git add memo.txt
git commit
エディタが開いたら、マージコミットメッセージを確認して保存します。
Step 8: 履歴を確認する
git log --oneline --graph
マージコミットが作られていることを確認します。
よくあるエラー
| 状況 | よくある原因 | 確認すること |
|---|---|---|
| 印が残ったままcommitした | <<<<<<< を消していない | ファイル内を検索する |
| どちらを残すかわからない | 変更意図を確認していない | 差分と目的を読む |
| mergeをやめたい | コンフリクト解決前 | git merge --abort を検討 |
| 解決したのに終わらない | git add していない | git status を見る |
まとめ
コンフリクトは、Gitが自動で判断できない変更がぶつかった状態です。git status で対象ファイルを確認し、ファイル内の印を消して正しい内容に直し、git add と git commit で解決を記録します。
参考リソース
- git merge
- Pro Git: Basic Merge Conflicts
- GitHub Docs: Resolving a merge conflict using the command line