Skip to content
Latchkey

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-network

conflictの解決

望むバージョンになるようファイルを編集し、マーカーを削除し、結果を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をまれで小さく保ちます。

関連ガイド