以前、gitのfetch/mergeについての記事を書きましたが、理論的なことは書いてあっても実際に処理の流れをかいていなかったので、今回はそのことについてメモリます。
Contents
競合が起きるとき
gitでは一般的に
- (fetch and merge ) or pull
- 何らかの改修
- add & commit
- push
という流れをとりますが、下記のようなケースでは競合が発生します。
Step1 山田さんがAをコミット→プッシュ
Step2 鈴木さんがプル後、Bをコミット→プッシュ
Step3 山田さんはBをプル
Step4 鈴木さんはD、Eをコミット→プッシュ
Step5 山田さんはプルせずにCをコミット図で書きますと以下のような状態です。
山田さん
A→B→C鈴木さん
A→B→D→Eリモート
A→B→D→E
この状態でmergeをしますが、同一ファイルに差分がある場合、自動でマージができず下記のようなメッセージが出力されます。こういったファイルの状態ことをコンフリクトが起きているといいます。
1 2 3 4 5 6 |
Auto-merging file1 Auto-merging file2 CONFLICT (content): Merge conflict in file3 Auto-merging file4 CONFLICT (content): Merge conflict in file5 Automatic merge failed; fix conflicts and then commit the result. |
コンフリクトの解決
このような場合、自動でmergeが働かないため、エディタでファイルを開き、下記のような競合を解決する必行があります。
vim file3
1 2 3 4 5 6 7 |
(共通な部分) <<<<<<<<<<<<<<<<<< HEAD echo "hogehoge" ======================= echo "foofoo"; >>>>>>>>>>>>>>>>>> FETCH_HEAD (共通な部分) |
これはローカルのコミットが上段でfetchで取り込んだリモートのコミットが下段という意味です。
これらを取り除き、下記のようにします。(通常はどちらかに合わせることが一般的でしょう。)
1 2 3 |
(共通な部分) echo "foofoo"; (共通な部分) |
このあとgit add & git commit と入力するとこの時点で競合を解消したというメッセージがすでにできています。
1 2 3 |
Merge branch 'master' of ~ Conflicts: file 3 |
以前はNetbeansでやっていたので、この処理をしっかり意識せずやっており、気づいたら解消されていたみたいなケースがあったので気を付けたいところですね。
参考