Skip to main content

Conflict とは

Conflict (コンフリクト) とは「衝突」という意味がある。 バージョン管理において、変更が被ることがあり、それを conflict と呼ぶ。

conflict がおきた場合には、コンピュータでは解決できないので、人間が手動で解決する必要がある。 なので、conflict の解決方法について知る必要がある。

Conflict を起こす

conflict を起こすためには、変更を被らせる必要がある。branch を作成し、二つの branch 間で同じファイルの行に変更を加える。

$ git checkout -b try-conflict

try-conflicthoge.txt を変更し、 commit する。

$ vi hoge.txt
$ cat hoge.txt

File is changed.
File is changed by try-conflict
$ git add hoge.txt
$ git commit -m "update hoge.txt"
[try-conflict 6c439cd] update hoge.txt
1 file changed, 1 insertion(+)

master ブランチに移動して、conflict させるために同じように hoge.txt に変更を加える。

$ git checkout master
$ vi hoge.txt
$ cat hoge.txt
File is changed.
File is changed by master
$ git add hoge.txt
$ git commit -m "update hoge.txt"

準備が整ったので merge して conflict させる。

$ git merge try-conflict

Auto-merging hoge.txt
CONFLICT (content): Merge conflict in hoge.txt
Automatic merge failed; fix conflicts and then commit the result.

Merge conflict in hoge.txt

conflict がおこったことが確認できる。

$ cat hoge.txgt

File is changed.
<<<<<<< HEAD
File is changed by master
=======
File is changed by try-conflict
>>>>>>> try-conflict

<<<<<<< HEAD======= の間は今いるブランチが持っていた変更 ( master で行ったの変更 )
=======>>>>>>> try-conflict の間は try-conflict ブランチが持っていた変更

Conflict を解決する

git merge は基本的に自動で行われるが、変更箇所が conflict (衝突) すると人間が手で merge する他、手はない。
今回は=======>>>>>>> を削除して両方の変更を取り入れた形にする。

$ vi hoge.txt
$ cat hoge.txt
File is changed.
File is changed by master
File is changed by try-conflict

手動マージが完了したら、変更を commit する。merge した時も commit しなければならない。

$ git add hoge.txt
$ git commit -m "merge"

コミットログを確認して、merge が commit されたことを確認する。

$ git log

commit fc446d5d9ffa796966999f9393776426b031c7c0
Merge: 9dffffb 6c439cd
Author: yutakakinjyo <yutakakinjyo@gmail.com>
Date: Thu Apr 16 17:11:00 2015 +0900

merge

commit 9dffffb0705e9e69052fe3e2c4dcc773fa0c4991
Author: yutakakinjyo <yutakakinjyo@gmail.com>
Date: Thu Apr 16 16:47:59 2015 +0900

update hoge.txt

commit 6c439cd35658899597cde36ef7cfe7fb84f09a17
Author: yutakakinjyo <yutakakinjyo@gmail.com>
Date: Thu Apr 16 16:27:30 2015 +0900

update hoge.txt

commit 76ed47e039ed71ab3039339c0dd91a976a326f15
Author: yutakakinjyo <yutakakinjyo@gmail.com>
Date: Thu Apr 16 15:31:17 2015 +0900

add for_commit file

commit 6202c613d4392578713287f4c82ff8ea5d8b6904
Author: yutakakinjyo <yutakakinjyo@gmail.com>
Date: Thu Apr 16 15:28:50 2015 +0900

write contents

commit a22c28a4b9eb1662cd08ac7304c6ee1fd00751af
Author: yutakakinjyo <yutakakinjyo@gmail.com>
Date: Thu Apr 16 15:27:00 2015 +0900

add hoge.txt

作成したブランチを削除する。

$ git branch -d try-conflict

まとめ

  • 変更同士を merge する時に、変更箇所が被っていた場合には、conflict(衝突) が起きる。
  • merge が conflict した場合には、手動で変更を加えて、再度 commti し直す。

conflict した場合に、conflict 箇所は例えば以下のように、現在の変更と、merge しようとしたブランチ名が表示された形になるので、それを手がかりに手動で merge する。

File is changed.
<<<<<<< HEAD
File is changed by master
=======
File is changed by try-conflict
>>>>>>