merge conflictとは?
merge conflictは、両側が同じ行を非互換な形で変更したためにGitが2つの変更を自動的に結合できないときに起きます。
merge conflictは不安に聞こえますが、Gitが判断を求めているだけです。2つのbranchがファイルの同じ部分を異なる形で変更すると、Gitはどのバージョンを望んでいるか分からないため、一時停止してあなたが解決できるようその箇所をマークします。conflictの読み方と直し方を知れば、恐怖のほとんどは消えます。
なぜconflictが起きるか
Gitは、変更がファイルの異なる部分に触れる場合、自動的にmergeします。conflictは、両方のbranchが同じ行を編集した場合、あるいは一方が他方の変更した箇所を削除した場合にのみ発生します。2つのbranchが分岐するほど、そして離れて存続する期間が長いほど、conflictの可能性は高まります。
conflictマーカーの読み方
Gitは両方のバージョンを示すマーカーを挿入するので、選ぶか組み合わせるかできます。
A conflict in a file
<<<<<<< HEAD
const timeout = 30;
=======
const timeout = 60;
>>>>>>> feature/slow-networkconflictの解決
望むバージョンになるようファイルを編集し、マーカーを削除し、結果をstageし、mergeを完了します。ツールやエディタは2つの側を並べて表示することで助けになりますが、どの変更が正しいかの判断は常にあなたのものです。
CI/CDにおけるconflict
CIはあなたの代わりにconflictを解決できませんが、その帰結を捉えられます。一部のプラットフォームは、ベースとconflictするpull requestのmergeを拒否します。またmergeされた結果をCIでtestすると、2つの変更が両方ともきれいに適用されるのに互いを壊すような、まったくテキスト上ではない論理的なconflictが表面化します。
conflictを減らす
- branchを短命に保ち、頻繁にmergeまたはrebaseする。
- 大きな変更をより小さなpull requestに分割する。
- 複数の人が同じファイルを編集するときは調整する。
- branchを完成させる前に最新のmainを取り込む。
重要なポイント
- conflictは、同じ行への2つの変更のどちらかをGitが選ばせる必要があることを意味します。
- conflictマーカーは両方のバージョンを示します。編集し、stageし、mergeを完了します。
- 短いbranchと頻繁な統合が、conflictをまれで小さく保ちます。
関連ガイド
What Is a Git Merge?What is a Git merge? An explainer on how merging combines branches, fast-forward versus merge commits, confli…
What Is a Git Rebase?What is a Git rebase? Learn how rebasing replays commits onto a new base for a linear history, how it differs…
What Is a Git Branch?What is a Git branch? Learn how branches are lightweight movable pointers, how they enable parallel work, and…