前回の記事では git merge を解説しました。
git merge は
ブランチを統合する操作
でした。
しかしブランチを統合する際、次のような問題が発生することがあります。
merge conflict
つまり コンフリクト(競合)です。
コンフリクトはGitを使った開発で必ず一度は経験する問題です。
この記事では次の内容を解説します。
- Gitコンフリクトとは
- コンフリクトが起きる原因
- コンフリクトの表示
- コンフリクトの解決方法
- コンフリクトを防ぐ方法
コンフリクトとは
コンフリクトとは
同じファイルの同じ場所を
複数のブランチが変更した状態
です。
Gitはどちらの変更を採用するべきか判断できないため、手動で解決する必要があります。
コンフリクトが起きる例
例えば次のような状況です。
mainブランチ
function greet() {
console.log("Hello")
}
featureブランチ
function greet() {
console.log("Hi")
}
この2つの変更をmergeすると、Gitはどちらを採用するべきか判断できません。
その結果
merge conflict
が発生します。
コンフリクト発生時の表示
コンフリクトが発生すると、ファイルには次のようなコードが表示されます。
<<<<<<< HEAD
console.log("Hello")
=======
console.log("Hi")
>>>>>>> feature-login
それぞれの意味は次の通りです。
<<<<<<< HEAD
現在のブランチのコード
=======
区切り
>>>>>>> feature-login
マージするブランチのコード
つまり
2つの変更が衝突している
という状態です。
コンフリクトの解決方法
コンフリクトは次の手順で解決します。
1 ファイルを編集
不要なコードを削除し、正しいコードを残します。
例
function greet() {
console.log("Hello")
}
または
function greet() {
console.log("Hi")
}
2 マーカーを削除
次の記号は必ず削除します。
<<<<<<<
=======
>>>>>>>
3 git add
修正したファイルをステージングします。
git add app.js
4 commit
その後コミットします。
git commit
これでコンフリクトは解決されます。
git statusで確認
コンフリクトが発生すると
git status
を実行したとき
both modified
と表示されます。
すべて解決すると
all conflicts fixed
になります。
VSCodeでの解決
最近はエディタを使って解決することが多いです。
VSCodeではコンフリクトがあると
Accept Current Change
Accept Incoming Change
Accept Both Changes
などの選択肢が表示されます。
これを使うと簡単に解決できます。
コンフリクトを防ぐ方法
コンフリクトは完全に防ぐことはできませんが、減らすことはできます。
こまめにpullする
作業前に
git pull
を行います。
小さくコミットする
変更を小さく分けることで衝突を減らせます。
ブランチを短命にする
長期間のブランチはコンフリクトが起きやすくなります。
GitHubでのコンフリクト
GitHubのPull Requestでもコンフリクトが表示されます。
例
This branch has conflicts
この場合
Resolve conflicts
ボタンから修正できます。
コンフリクトは怖くない
初心者はコンフリクトを怖がりますが
普通の作業
です。
開発では日常的に起こります。
重要なのは
落ち着いて修正する
ことです。
まとめ
この記事では Gitコンフリクト を解説しました。
重要なポイント
コンフリクト = 同じ場所の変更
解決手順
編集
↓
git add
↓
git commit
コンフリクトはGit開発では避けられないものですが、正しい手順を知っていれば簡単に解決できます。
次の記事
次回は
GitHub Flow
を解説します。
GitHub Flowは
GitHubでの開発手順
です。
これを理解すると、実際のチーム開発の流れが分かります。


コメント