枝分かれした複数の作業ブランチをマージ(統合)する際、まれに起こるのが修正箇所の衝突(コンフリクト)です。
今回は
- 修正箇所が衝突した際にどのようなことが起こるのか?
- 衝突した際の解消方法
などについてご紹介していきます。
修正箇所の衝突とは
下記の図にはコミット1から派生したmainブランチとhogeブランチがある。
mainブランチにはコミット2があり、hogeブランチにはコミットAがある。また、どちらもコミット1を親として参照している
mainブランチではindex.htmlファイルの1行目に<p>コンフリクトとは?</p>と記述した。
hogeブランチではindex.htmlファイルの1行目に<p>衝突すること</p>と記述した。
この状態でmainブランチにhogeブランチの修正情報をmergeしようとすると・・・
どちらも同じ個所を修正しているためにどちらを反映させればよいのかgitが判断できなくなってしまい、コンフリクト(衝突)となる。
mergeコマンドの詳細な使用方法は下記を参照してください。
コンフリクトさせて解決方法を試す
下準備として下記を行う。
mainブランチ
・index.htmlの1行目に<p>コンフリクトとは?</p>を追記してコミットする
hogeブランチ
・ index.htmlの1行目に<p>衝突すること</p>を追記してコミットする
現在のブランチを確認する
$ git branch
hoge
* main //mainブランチにいることがわかる
sample
今回はmainブランチにhogeブランチの修正をマージする
$ git merge hoge
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html //詳細①
Automatic merge failed; fix conflicts and then commit the result.
詳細①
index.htmlファイルにてコンフリクトが発生していることがわかる。
git statusでも確認ができる。
$ git status
On branch main //詳細②
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
詳細②
コンフリクトが発生してマージができていないと表示されていることがわかる。またその対象ファイルがindex.htmlと記載されている。
対象のファイルindex.htmlを開くと下記の図のように表示される
HEAD<~=======までの範囲がmainブランチで修正した内容
======= ~>hogeまでの範囲がhogeブランチで修正した内容
開いてるエディター内でそのまま修正が可能なので必要な修正をしたら、不要な部分は削除して保存をすれば解決できる。
index.htmlファイルを修正したらコミットまで実行して確認のためにgit statusコマンドを実行してみる。
$ git status
On branch main
Your branch is ahead of 'origin/main' by 3 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
コンフリクトに関する記述が消えていることがわかる。