Dev Study
← Gitの内部構造から理解する コース

9. コンフリクト — なぜ起きるのか、なぜ人間が要るのか

コンフリクトは「Gitの不具合」でも「操作を間違えた罰」でもありません。3-way mergeの構造から、原理的に自動判断できないケースがあるというだけです。

① 3点を比べて判断している

あるファイルについてGitが見る3つの版
共通祖先の版(base)分岐する前の姿
これと比べて
自分側の版(ours)
相手側の版(theirs)
  • ・片方だけがbaseから変わっている → 変わった方を採用(自動)
  • ・両方とも変わっていない → そのまま(自動)
  • ・両方が別々に変わっている → どちらが正しいか決められない(競合)

自動でマージできるかどうかは、この3点比較の結果だけで決まります。ファイルが同じでも、変更箇所が離れていれば競合しません。

② 競合したときGitが作業ツリーに書くもの

コンフリクトマーカーの構造
<<<<<<< HEADここから自分側
自分側の内容
=======境界
相手側の内容
>>>>>>> featureここまで相手側
  • ・Gitは判断を放棄して、両方の候補を並べて人間に委ねている
  • ・この状態ではマージコミットはまだ作られていない
  • ・解決 = ファイルを正しい内容に直し、マーカーを消して git add する

コンフリクトは「どちらの意図が正しいか」という、コードの意味に踏み込む判断です。だから機械ではなく人間が決めます。前のレッスンのシミュレータで実際に起こせます。

サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗