こんにちは。
いつでもLGTMは嬉しい。
どうもハチマキです。
はじめに
今となっては問題なく解消できるようになったコンフリクト。
エンジニア成り立ての時は、コンフリクトが発生した時点で重い腰をあげるように解消に挑んだものです。
今回は、発生したコンフリクトの発生原因とその解決法について書いていこうと思います。
環境
- 変更管理ツール:git / GitHub
- 言語:Ruby
- フレームワーク:Ruby on Rails
- マシン:Mac
問題
作業ブランチで進めていた開発作業が完了し、いざGithubにgit pushしたら一部のファイルでコンフリクト(競合)が発生した。。
コンフリクトってなに?発生原因は??
端的にいうとコンフリクトは、ファイル同士の競合です。
https://wa3.i-3-i.info/word11329.html
コンフリクトの発生原因は、同じもの(ファイルやコード)を同じタイミングで使う(修正や追加)ことにより、整合性がとれなくなることで発生します。
例えば、AさんがTODO登録機能を開発するために、最新のmasterファイルをgit pullして、作業ブランチを作成します。
一方Bさんは、TODO更新機能を作成するため、Aさんと同様の手順を踏んで、作業ブランチを作成し、開発を進めています。
1週間後、Aさんは開発が完了し、ファイルZをgithubにpushして作業ブランチをmasterファイルにmergeします。(*現時点で最新のmasterファイルが更新されました)
その2日後、Bさんも進めていた開発が完了したため、修正したファイルZとファイルYの2つのファイルをgithubにpushします。
おそらくここで、今回テーマであるコンフリクトが発生するはずです。
Aさんの編集ファイルZが、masterブランチにmergeされたことで、Bさんが現在作業ブランチで使用しているファイルZとの整合性(Aさんが編集したファイルZの情報がない)が取れないことが理由でコンフリクトが発生します。
*補足
開発現場では、時よりコンフリクトが発生します(僕は何度も出くわしました)
理由はご察しの通り、複数人で開発を進めているためです。そのため、上記例にあげたことが常に起こっているため、タイミングよく、同ファイルを修正し、誰かがmasterファイルにmergeすると、今回のように整合性が取れずコンフリクトが発生するのです。
ただ、解消方法自体は、至って簡単ですので、順を追って解消していきましょう!
解消方法
*作業ブランチは、test_fileとします。
*github上でコンフリクトしたファイルを確認しておく(下の方にファイルパスがあるはず)とコンフリクトファイルが事前に把握できます。
▼言葉で表した手順です。
- 作業ブランチからmasterブランチに切り替える
- ローカル環境のmasterブランチを最新にする
- masterブランチから作業ブランチに切り替える
- 作業ブランチに最新のmasterブランチをmergeする(mergeすると、ターミナルやファイル内で競合したファイルパス、コードの箇所を教えてくれると思います)
- conflictが発生した箇所(コード)を修正する
- 編集ファイルをgit addする
- 編集ファイルをgit commitする
- 編集ファイルをgit pushする
以上です。
▼続いて、実行コマンドに変換した手順です。
1. $ git checkout master 2. $ git pull origin master 3. $ git checkout test_file 4. $ git merge master Auto-merging ファイルパス CONFLICT (content): Merge conflict in ファイルパス ... Automatic merge failed; fix conflicts and then commit the result. # 補足 # $ git stateでファイルを一度確認 5. conflictが発生した箇所(コード)を修正する 6. $ git add test_file 7. $ git commit -m 'fix Conflicting files' 8. $ git push origin test_file 以上です。
これで、コンフリクトは解消できるはずです。
コンフリクトが発生すると、最初はなかなか焦りますが、一旦深呼吸して実行できれば意外とすんなり解消できるものです。