コンフリクトを体験して解消する(Gitチーム開発)
Gitチーム開発シリーズ:なぜGitを使うのか|WinFormsで2人開発を体験する|コンフリクトを体験して解消する(今ここ)|[目次へ]
前回は、役割分担して同じファイルを同時に編集しないことで、コンフリクトを避けながら2人開発する方法を紹介しました。
しかし実際の開発では、うっかり同じファイルを編集してしまうこともあります。コンフリクトが起きたときに慌てないため、今回はわざとコンフリクトを起こして解消する体験をしてみましょう。
この記事の目的
- コンフリクトがなぜ起きるか理解する
- コンフリクトマーカー(
<<<<<<<など)の意味を知る - コンフリクトを解消する手順を体験する
注意:本番の開発ではコンフリクトを避けることが基本です。この記事は学習用に、あえてコンフリクトを起こす内容です。
前提条件
- WinFormsで2人開発を体験する を完了している
- 電話帳アプリが完成し、両者が同じ状態を Pull している
- Aさん・Bさんの役割で、同じリポジトリを共有している
コンフリクトとは
コンフリクト(競合) は、2人以上が同じファイルの同じ部分を別々に編集したときに発生します。
Git は「どちらの変更を採用するか」を自動で判断できないため、人間が決める必要があります。
コンフリクトを起こす手順
電話帳アプリの data.txt を使って、意図的にコンフリクトを起こします。
① 両者が同じ状態にする
Aさん・Bさんとも、次の状態にします。
- 電話帳アプリが完成している
git pullで最新の状態を取得済みdata.txtの内容が同じ(例:1行目が「田中,090-1111-1111」)
② Aさん:data.txt の1行目を変更
やること
data.txtを開く- 1行目を 「山田太郎,090-1234-5678」 に変更する
- 保存
- GitHub Desktop で Commit:「1行目を山田太郎に変更」
- Push
③ Bさん:同じ data.txt の1行目を別の内容に変更
重要:Aさんの Push の前に Bさんも編集を始めている想定です。Bさんは Aさんの変更をまだ Pull していません。
やること
data.txtを開く- 1行目を 「佐藤花子,080-9999-8888」 に変更する
- 保存
- GitHub Desktop で Commit:「1行目を佐藤花子に変更」
- Push
※Bさんが先に Push した場合、次は Aさんが Pull でコンフリクトを体験します。どちらが先に Push するかで、コンフリクトを解消する担当が変わります。
④ コンフリクトが発生する
ここで、後から Pull した人がコンフリクトを体験します。
例:Aさんが Pull した場合
- Aさんが GitHub Desktop で Pull を実行
- 「Merge conflict」などのメッセージが表示される
data.txtを開くと、次のようなコンフリクトマーカーが入っています
<<<<<<< HEAD
山田太郎,090-1234-5678
=======
佐藤花子,080-9999-8888
>>>>>>> xxxxx (Bさんのコミット)
コンフリクト発生時のダイアログ(GitHub Desktop)
Pull を実行すると、「Resolve conflicts before Merge」というダイアログが表示されます。
| 表示内容 | 意味 |
|---|---|
| 1 conflicted file | コンフリクトしているファイル数 |
| ファイル名(例:data.txt) | どのファイルでコンフリクトが起きているか |
| 右上の× | ダイアログを閉じる(マージは続行、解消作業へ進む) |
| Continue merge | 解消後にマージを続行する |
| Abort merge | マージを中止する(解消に失敗したときなど) |
※「Open in Visual Studio Code」が表示されても使わず、右上の×でダイアログを閉じ、次の手順で解消します。
コンフリクトマーカーの意味
| マーカー | 意味 |
|---|---|
<<<<<<< HEAD | 自分の変更(現在のブランチ)の開始 |
======= | 自分の変更と相手の変更の区切り |
>>>>>>> xxxxx | 相手の変更(Pull してきたコミット)の終了 |
HEAD は「今いるブランチの最新」を指します。つまり、<<<<<<< と ======= の間が自分の変更、======= と >>>>>>> の間が相手の変更です。
コンフリクトを解消する
どちらの変更を残すか、または両方を組み合わせるかを人間が決めます。
解消の選択肢
| 選択肢 | 内容 |
|---|---|
| 自分の変更を残す | <<<<<<< 〜 >>>>>>> 全体を、自分の部分だけに置き換える |
| 相手の変更を残す | <<<<<<< 〜 >>>>>>> 全体を、相手の部分だけに置き換える |
| 両方残す | 2行とも残す(data.txt の場合は行を追加する形になる) |
| 別の内容にする | どちらでもなく、新しい内容を書く |
手順(例:佐藤花子の方を残す場合)
- ダイアログを閉じ、Visual Studio でプロジェクトを開いている状態で
data.txtを開く(すでに開いていれば、ソリューションエクスプローラーからdata.txtをダブルクリック) - コンフリクトマーカーをすべて削除し、残したい内容だけにする
解消後(佐藤花子を残す場合)
佐藤花子,080-9999-8888
佐藤,090-2222-2222
鈴木,090-3333-3333
※1行目だけが「佐藤花子,080-9999-8888」になり、マーカーは一切残さない。
- ファイルを保存
- GitHub Desktop で Commit:「コンフリクト解消、佐藤花子を採用」
- Push
Visual Studio のコンフリクト解消機能
data.txt をダブルクリックするとマージエディターが開き、3つのペイン(受信・現在・結果)で表示されます。ツールバーのボタンで解消できます。
- 現在を取得:自分の変更を残す(現在:ローカル の内容を採用)
- 入力方向を取得:相手の変更を残す(受信:リモート の内容を採用)
解消後は「マージの許可(A)」をクリックして確定します。
Visual Studio での具体的な手順
電話帳アプリを Visual Studio で開いている場合、次の手順で解消できます。
- ダイアログを閉じ、Visual Studio でプロジェクトを開く(すでに開いていればそのまま)
- メニュー「表示(V)」→「Git 変更(G)」を開く(または Ctrl + 0, Ctrl + G)
- 「マージされていない変更」内に表示される
data.txt([両方変更])をダブルクリックして開く - マージエディターが開いたら、ツールバーの「現在を取得」または「入力方向を取得」をクリック
- 現在を取得:自分の変更を残す
- 入力方向を取得:相手の変更を残す(例:佐藤花子を採用する場合)
- 「マージの許可(A)」をクリックして解消を確定
- GitHub Desktop に戻り、Commit:「コンフリクト解消、佐藤花子を採用」→ Push(「Resolve conflicts」バナーが表示されていても、マージの許可まで完了していれば Commit 可能)
解消に失敗したとき
コンフリクト解消を途中でやめたい場合、マージを中止できます。
GitHub Desktop の場合
- 「Abort merge」や「マージを中止」などのオプションが表示されることがあります
- または、コマンドラインで
git merge --abortを実行
マージを中止すると、Pull する前の状態に戻ります。
解消後の確認
コンフリクトを解消して Push したら、もう一方の人が Pull して最新の状態を取得します。
両者で data.txt の内容が同じになっていれば、解消は成功です。
本番開発ではコンフリクトを避ける
この記事では学習のためにわざとコンフリクトを起こしました。
実際の開発では、次のようにコンフリクトを避けることが基本です。
- 役割分担して、同じファイルを同時に編集しない
- 作業前に必ず Pull する
- 担当するファイルを事前に決めておく
コンフリクトが起きても解消できることを知っておくことで、いざというときに慌てずに対応できます。
まとめ
- コンフリクト:同じファイルの同じ部分を別々に編集したときに発生する
- コンフリクトマーカー:
<<<<<<<、=======、>>>>>>>で、自分の変更と相手の変更が区切られる - 解消:どちらを残すか決め、マーカーを削除して内容を整え、Commit → Push
- 本番では:役割分担などでコンフリクトを避けることが基本
コンフリクトを一度体験しておくと、「起きたときにどうすればよいか」が分かり、チーム開発がよりスムーズになります。





ディスカッション
コメント一覧
まだ、コメントがありません