はじめに
Git で git pull
を実行した際に、ローカルの変更とリモートの変更が競合し、マージができないことがあります。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
本記事では Makefile で発生した競合 を例に、競合解決の方法 を解説します。
書こうと思ったきっかけ
最近、チーム開発中に Makefile の競合 に遭遇しました。普段はスムーズに git pull
できていたのに、ある日 stash pop
をしたところ競合が発生し、手動での解決が必要になりました。
競合自体はよくあるものですが、解決の流れを整理しておくことで、今後同じ問題に直面したときにスムーズに対応できる と思い、記録として残すことにしました。
Git を使った開発では、複数のメンバーが同じファイルを編集することが頻繁にあります。
そのため、競合が発生することは避けられません。しかし、適切な方法で解決すれば、スムーズに開発を進めることができます。
本記事では、競合が発生した場合の具体的な対処方法 を詳しく説明します。
エラーの発生状況
~/Desktop/test/skill-typing-front (git)-[develop]- git stash pop
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
On branch develop
Your branch is up to date with 'origin/develop'.
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: Makefile
Untracked files:
(use "git add <file>..." to include in what will be committed)
skill-typing-front/public/mockServiceWorker.js
no changes added to commit (use "git add" and/or "git commit -a")
このエラーは、リモートリポジトリの Makefile
とローカルの Makefile
に競合があり、自動マージできなかったことを示しています。
競合が発生する原因としては、以下のようなケースが考えられます。
- リモートリポジトリにある
Makefile
が更新されている間に、ローカルでも同じファイルを変更した。 - 他の開発者が
Makefile
に変更を加え、それがリモートに反映された後にローカルで作業をしていた。 -
git stash pop
を実行した際に、リモートの変更とローカルの変更が衝突した。
このような状況では、手動で修正を行い、競合を解決する必要があります。
実際の解決方法(私の環境)
競合を解決するためには、以下の手順を実行します。
-
競合の確認
git status
を実行し、競合しているファイル (
Makefile
) を特定します。 -
競合の修正
Makefile
を開き、競合マーカー (<<<<<<<
,=======
,>>>>>>>
) を削除して、適切な形で統合します。 -
変更をステージング
git add Makefile git commit -m "Resolve conflict in Makefile"
競合を解決したら、変更をコミットして保存します。
-
不要な
stash
の削除
競合が発生した場合、stash
は削除されずに残っているので、不要なら以下を実行します。git stash drop
-
変更をリモートへプッシュ
git push origin develop
競合を解決した後は、リモートリポジトリに変更を反映させましょう!
まとめ
競合解決は最初は難しく感じるかもしれませんが、慣れてくるとすぐに対応できるようになります。プロジェクトによっては、他のメンバーとのコミュニケーションをとりながら競合を解決することも大切です。
競合を未然に防ぐために、定期的に git pull
してリモートの最新状態を取り込みながら作業を進めることをおすすめします。
また、機能ごとにブランチを分けて開発を進めることで、競合の発生を減らすことも可能です。Git を正しく活用し、スムーズなチーム開発を実現しましょう!