マージとコンフリクトとは何か
Git のマージは、別々のブランチで進めた変更を、1つにまとめる操作です。同じ行を2人が変えたときは、Git が自分で選べず、コンフリクトとして知らせます。
蕎麦屋で、1人が「そばを値下げ」、もう1人が「そばを値上げ」と、同じ行を直しました。どちらを採るかは、人が決めます。
このレッスンのゴール
メモ
2つのブランチをマージし、コンフリクトが出たら解決することができる。
大事な言葉
| ことば | いみ | れい |
|---|---|---|
| マージ | 別のブランチの変更を、今のブランチに取り込むこと(merge) | git merge sale |
| 早送り | 分かれていない場合に、ブランチの名前を先へ進めるだけのマージ(fast-forward) | |
| マージコミット | 2つの親を持つ、合流のコミット | |
| コンフリクト | 同じ行が別々に変わり、Git が選べない状態(conflict) | |
| 印の行 | Git が書き込む <<<<<<<、=======、>>>>>>> の3種類の行 |
学生が入力するセルは、このプレビューでは空白です。
マージには2つの形がある
main が進んでいなければ、sale の変更を取り込むのは簡単です。main の名前を先へ進めるだけで、これを早送りと呼びます。
両方が進んでいるなら、Git は2つの変更を合わせて、新しいマージコミットを作ります。
2つのマージの違い
| 場合 | Git がすること | 新しいコミット |
|---|---|---|
| main が進んでいない | 名前を先へ進める(早送り) | できない |
| 両方が進んでいる | 変更を合わせる | マージコミットができる |
| 同じ行が別々に変わった | 止まって、人に聞く | あなたが解決するまで、できない |
学生が入力するセルは、このプレビューでは空白です。
リポジトリを作る
git init -q -b main planここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
価格表を作る
printf "udon 500\nsoba 550\ntempura 300\n" > plan/menu.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ステージに置く
git -C plan add menu.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
最初のコミット
git -C plan commit -q -m "価格を決める"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2つのブランチが、同じ行を変える
蕎麦屋の価格表で試します。名前をまだ教えていないなら、レッスン1の2行を先に打ってください。
まず sale というブランチで、そばを500円に下げます。次に main に戻って、同じ行を600円に上げます。
sed -i は、ファイルの中の文字を置き換えるコマンドです。s/soba 550/soba 500/ は、前の文字を後ろに替えます。
sale ブランチを作る
git -C plan switch -c saleここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
sale で値下げする
sed -i 's/soba 550/soba 500/' plan/menu.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
sale でコミットする
git -C plan commit -q -am "そばを値下げする"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
main に戻る
git -C plan switch mainここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
main で値上げする
sed -i 's/soba 550/soba 600/' plan/menu.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
main でコミットする
git -C plan commit -q -am "そばを値上げする"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
git merge は、コンフリクトで止まる
main の上で sale をマージします。同じ行が別々に変わっているので、Git は止まります。
出力に CONFLICT と出ます。status --short で UU と出るのは、両方が変えた(unmerged)という意味です。このマージの終了コードは、1になります。
sale をマージする
git -C plan merge saleここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
状態を見る
git -C plan status --shortここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Git が書いた内容を読む
cat plan/menu.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
3つの印の行が、2つの版を分ける
<<<<<<< HEAD から ======= までが、今いるブランチ(main)の版です。======= から >>>>>>> sale までが、取り込む側(sale)の版です。
解決は3つの手順です。ほしい文章にファイルを直し、印の行をすべて消し、git add と git commit をします。
解決して、マージを終える
ここでは、ファイルを3行の「そば550円」に書き直します。printf で全体を書き直すと、印の行も消えます。
git commit --no-edit は、Git が用意したメッセージをそのまま使います。エディタは開きません。
ファイルを書き直す
printf "udon 500\nsoba 550\ntempura 300\n" > plan/menu.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
解決したと伝える
git -C plan add menu.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
マージを終える
git -C plan commit --no-editここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
グラフで見る
git -C plan --no-pager log --graph --format="%s"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
印の行を残したまま add して commit する人がいます。Git は止めません。ファイルに <<<<<<< が入ったまま、記録されてしまいます。commit の前に、ファイルを読み直しましょう。