← Gitの内部構造から理解する コース
9. コンフリクト — なぜ起きるのか、なぜ人間が要るのか
コンフリクトは「Gitの不具合」でも「操作を間違えた罰」でもありません。3-way mergeの構造から、原理的に自動判断できないケースがあるというだけです。
① 3点を比べて判断している
共通祖先の版(base)分岐する前の姿
これと比べて
自分側の版(ours)
相手側の版(theirs)
- ・片方だけがbaseから変わっている → 変わった方を採用(自動)
- ・両方とも変わっていない → そのまま(自動)
- ・両方が別々に変わっている → どちらが正しいか決められない(競合)
自動でマージできるかどうかは、この3点比較の結果だけで決まります。ファイルが同じでも、変更箇所が離れていれば競合しません。
② 競合したときGitが作業ツリーに書くもの
<<<<<<< HEADここから自分側
自分側の内容
=======境界
相手側の内容
>>>>>>> featureここまで相手側
- ・Gitは判断を放棄して、両方の候補を並べて人間に委ねている
- ・この状態ではマージコミットはまだ作られていない
- ・解決 = ファイルを正しい内容に直し、マーカーを消して git add する
コンフリクトは「どちらの意図が正しいか」という、コードの意味に踏み込む判断です。だから機械ではなく人間が決めます。前のレッスンのシミュレータで実際に起こせます。
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗