クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

Git のマージとコンフリクトの解決

このレッスンのあとで: 2つのブランチをマージし、コンフリクトが出たら解決することができる。

60分のレッスンコマンド17件Git と Gitea のラボ:自分専用の Git サーバーでクローン、コミット、プッシュを学ぶ

マージとコンフリクトとは何か

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 の前に、ファイルを読み直しましょう。

このラボとソースについて: Git と Gitea のラボ:自分専用の Git サーバーでクローン、コミット、プッシュを学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。