ブランチ:作業を枝分かれさせる
- ブランチ(枝)が何のためにあるかを、説明できる
- ブランチを作り、切り替えて、作業できる
- 作業した枝を、
mainに合流(マージ)できる git log --graphで、枝分かれと合流の様子を読める
6-1. ブランチとは
ここまでは、記録(コミット)を、main だけの一本道で積み重ねてきました。第5章で見たとおり、一人で記録を続けるだけなら、それで十分です。この章では、一人でも役に立つ道具として、ブランチを学びます。
ブランチ(branch、枝)を使うと、この道を途中で枝分かれさせて、別々に作業を進められます。
- 思い切って、試せる。「うまくいくか分からない書き換え」は、別の枝でやります。うまくいけば
mainに合流させ、だめなら、mainに戻るだけです。 mainを、いつも「完成した状態」に保てる。書きかけの作業が、mainに混ざりません。- 作業ごとに、分けられる。「プロフィールを書く」「誤字を直す」など、1つの作業を1つの枝にします。途中で、急ぎの別の作業が入っても、混ざりません。
main は c5d2e8a を、add-notes は1つ先の e4f6a1b を指している。HEAD は add-notes にいる| 言葉 | 意味 |
|---|---|
| ブランチ(branch) | 枝。作業の流れに付ける「名札」。コピーを作るわけではないので、作るのも消すのも、一瞬 |
main | いちばん基本になる枝。完成した、動く状態を置く |
HEAD | 「今、どの枝にいるか」を示す目印 |
| マージ(merge) | 別々に進んだ枝を、1つに合流させること |
6-2. 実習A:枝を作って、合流させる
第4章で使った my-notes で、notes.txt というファイルを、別の枝で作り、main に合流させます。
- 入力モードは「半角英数」に。
- 場所は
C:\work\my-notes(OneDrive の外)。gitを打つ前に、プロンプトの場所を確かめます。 - 表示のコミットID(
3f2a9c1など)は、人によって違います。
手順1:準備する
cd C:\work\my-notes
git status
git pull
git branch
PS C:\work> cd C:\work\my-notes PS C:\work\my-notes> git status On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean PS C:\work\my-notes> git branch * main
git branch は、ブランチの一覧を出します。* が付いている枝が、今いる枝です。今は、main だけです。git status が「きれい(working tree clean)」で、pull で最新になっていることを確かめてから、始めます。
💡 branch は「枝」という意味です。
手順2:枝を作って、そこへ移る
git switch -c add-notes
git branch
PS C:\work\my-notes> git switch -c add-notes Switched to a new branch 'add-notes' PS C:\work\my-notes> git branch * add-notes main
add-notes という枝を作って、そこに移りました。* が add-notes に移っています。
💡 switch は「切り替える」。-c は create(作る)の頭文字で、「作ってから、切り替える」という意味です。
git switch -c add-notes で、次のエラーが出ることがあります。
PS C:\work\my-notes> git switch -c add-notes fatal: a branch named 'add-notes' already exists「
add-notes という名前のブランチが、すでにあります」という意味です。以前に、この手順を試して、作ってあったときに出ます。壊れてはいません。(-c は「新しく作る」なので、同じ名前があると、エラーになります。)
まず、状況を確かめます。
git branch -v
git log --oneline --graph --all
- 合流済みのとき(
add-notesが、mainと同じコミットを指している):git branch -d add-notesで片付けてから、もう一度git switch -c add-notesを打ちます。 - まだ合流していないとき(
-dがnot fully mergedと止める):無理に消さずに、別の名前(たとえばadd-notes2)で、作り直します。以降のadd-notesは、add-notes2に読み替えてください。
-c を付けずに、git switch add-notes と打ちます。
-)を使います。スペースは使えません。「何をする枝か」が分かる名前にします(例:add-notes、fix-typo)。
手順3:この枝で、作業して、記録する
New-Item notes.txt
notepad notes.txt
メモ帳が開いたら、my notes と書いて、最後に Enter で改行して、保存して閉じます。続けて、記録します。
git add notes.txt
git commit -m "Add notes.txt"
git log --oneline
PS C:\work\my-notes> git add notes.txt PS C:\work\my-notes> git commit -m "Add notes.txt" [add-notes e4f6a1b] Add notes.txt 1 file changed, 1 insertion(+) create mode 100644 notes.txt PS C:\work\my-notes> git log --oneline e4f6a1b (HEAD -> add-notes) Add notes.txt c5d2e8a (origin/main, main) Add third line 7b1e4d8 Add second line to hello.txt 3f2a9c1 Add hello.txt
履歴を読んでみましょう。add-notes は、main より1つ先に進んでいます(図の状態です)。main は、まだ Add third line のままです。
手順4:切り替えると、ファイルが「現れたり、消えたり」する
ここが、ブランチの面白いところです。main に切り替えて、フォルダの中身を見てみましょう。
git switch main
ls
PS C:\work\my-notes> git switch main Switched to branch 'main' Your branch is up to date with 'origin/main'. PS C:\work\my-notes> ls Directory: C:\work\my-notes Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2026/10/11 11:20 36 hello.txt
notes.txt が、消えました!(エクスプローラーで開いたままにしておくと、目の前で消えるのも見られます。)では、元の枝に戻します。
git switch add-notes
ls
PS C:\work\my-notes> git switch add-notes Switched to branch 'add-notes' PS C:\work\my-notes> ls Directory: C:\work\my-notes Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2026/10/11 11:20 36 hello.txt -a---- 2026/10/11 11:32 10 notes.txt
notes.txt が、戻ってきました。ファイルが消えたのではありません。ブランチを切り替えると、作業フォルダの中身が、その枝の状態に入れ替わるのです。
git switchgit status で「きれい」を確かめる
まだ記録(commit)していない変更があるまま切り替えると、その変更が、切り替え先の枝に、ついてきます(または、エラーで止まります)。どの枝の変更か分からなくなるので、切り替える前は、記録しておくのが基本です。
手順5:main に合流させる(merge)
作業が終わった枝を、main に合流させます。「合流させたい側」(main)に移ってから、merge します。
git switch main
git merge add-notes
PS C:\work\my-notes> git switch main Switched to branch 'main' Your branch is up to date with 'origin/main'. PS C:\work\my-notes> git merge add-notes Updating c5d2e8a..e4f6a1b Fast-forward notes.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 notes.txt
Fast-forward(早送り)と出ました。main が動いていなかったので、main の名札を、先に進めるだけで済んだ、という意味です。main でも、notes.txt が見えるはずです。履歴の図も、見てみましょう。
git log --oneline --graph --all
PS C:\work\my-notes> git log --oneline --graph --all * e4f6a1b (HEAD -> main, add-notes) Add notes.txt * c5d2e8a (origin/main) Add third line * 7b1e4d8 Add second line to hello.txt * 3f2a9c1 Add hello.txt
💡 merge は「併合する、合流させる」。--graph は「図にする」、--all は「すべての枝を」の意味です。
git merge を git marge のように打ち間違えると、次のように、正しい綴りを、提案してくれます。
PS C:\work\my-notes> git marge add-notes git: 'marge' is not a git command. See 'git --help'. The most similar command is merge「
marge は、Git のコマンドではありません。いちばん似ているのは merge です」という意味です。壊れてはいません。↑ キーで前のコマンドを呼び出して、直して、打ち直しましょう。
手順6:役目を終えた枝を、片付ける
git branch -d add-notes
git branch
PS C:\work\my-notes> git branch -d add-notes Deleted branch add-notes (was e4f6a1b). PS C:\work\my-notes> git branch * main
枝は、名札を消しただけです。記録(コミット)は、main に合流済みなので、消えません。
💡 -d は delete(削除)の頭文字です。
-d が安全。大文字の -D は危険
まだ合流していない枝を -d で消そうとすると、error: the branch '…' is not fully merged. と出て、止めてくれます。これは、「合流していない記録が、失われるよ」という警告です。大文字の -D は、その警告を無視して、強制的に消します。意味が分かるまで、使わないでください。
手順7:GitHub に送る
git push
PS C:\work\my-notes> git push Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Writing objects: 100% (3/3), 310 bytes | 310.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 To https://github.com/chitchi1216/my-notes.git c5d2e8a..e4f6a1b main -> main
GitHub の main にも、notes.txt が届きました。
実習A の流れ(まとめ)
git switch -c 枝の名前:枝を作って、移る- 作業して、
add→commit git switch main:合流先(main)に戻るgit merge 枝の名前:合流させるgit branch -d 枝の名前:枝を片付ける
cd C:\work\my-notes で戻ってから、始めてください。
6-3. 実習B:お互いが進んだあとの、合流
実習A では、main が動いていなかったので、「早送り」で済みました。しかし、枝で作業している途中に、急ぎの別の作業(誤字の修正など)を、main で済ませることも、よくあります。すると、合流するまでの間に、main のほうも、進んでいる状態になります。その場合を体験します。
手順1:枝 feature-a で、a.txt を作る
git switch -c feature-a
New-Item a.txt
notepad a.txt
a と書いて(最後に Enter)保存、閉じて、記録します。
git add a.txt
git commit -m "Add a.txt"
手順2:main に戻って、main でも作業する
git switch main
New-Item b.txt
notepad b.txt
b と書いて(最後に Enter)保存、閉じて、記録します。
git add b.txt
git commit -m "Add b.txt"
これで、feature-a と main が、それぞれ別々に1つずつ進みました(図の右側の状態です)。
手順3:合流させる
git merge feature-a
メモ帳が開きます。最初の行に、Merge branch 'feature-a' と書かれています。これは、合流コミットのメッセージです。何も変えずに、保存して(Ctrl + S)、メモ帳を閉じてください(# で始まる行は、説明なので、無視されます)。メモ帳が開いている間は、ターミナルに hint: Waiting for your editor to close the file... と出ます。閉じると、unix2dos / dos2unix の行が出ます。第3章と同じ、無視してよいお知らせです。
PS C:\work\my-notes> git merge feature-a hint: Waiting for your editor to close the file... unix2dos: converting file C:/work/my-notes/.git/MERGE_MSG to DOS format... dos2unix: converting file C:/work/my-notes/.git/MERGE_MSG to Unix format... Merge made by the 'ort' strategy. a.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 a.txt
Merge made by … は、合流コミットが作られたという意味です。ls で見ると、a.txt も b.txt も、両方あるはずです。
手順4:履歴の図を見る
git log --oneline --graph --all
PS C:\work\my-notes> git log --oneline --graph --all * f1a29e4 (HEAD -> main) Merge branch 'feature-a' |\ | * 2b7c9d1 (feature-a) Add a.txt * | 6c3f0a8 Add b.txt |/ * e4f6a1b Add notes.txt * c5d2e8a (origin/main) Add third line * 7b1e4d8 Add second line to hello.txt * 3f2a9c1 Add hello.txt
枝分かれして、また1つに合流した様子が、図として読めます。* が1つのコミット、| や \ / が、枝の流れです。
片付けて、GitHub に送ります。
git branch -d feature-a
git push
6-4. 第4章の git pull の、正体
第4章で、git pull は「fetch(取ってくる)と merge(合わせる)を続けて行うコマンド」と説明しました。ここまで来れば、意味が分かります。
- GitHub の
main(origin/main)を、取ってくる(fetch) - それを、自分の
mainに、マージする(merge)
自分の main が進んでいなければ「早送り」、お互いが進んでいれば「合流コミット」になります。第4章のチャレンジ3で、メモ帳が開いたのは、そのためです。
☕ コーヒーブレイク:「master」から「main」へ。checkout から switch へ(読み飛ばしてOK)
「main」という名前の歴史 昔の Git では、最初の枝の名前は、master が標準でした。2020年ごろ、「master(主人)」という言葉が、人を支配する関係を連想させる、という指摘が広がりました。GitHub は、2020年10月から、新しく作るリポジトリの最初の枝を main にしました。Git 本体も、バージョン 2.28 で、最初の枝の名前を設定できる init.defaultBranch を追加しました。第3章で、この設定を行った理由です。古い資料に master と書かれていたら、main と同じ役割だと読み替えてください。
「switch」というコマンド ネットの古い手順では、ブランチの切り替えに git checkout が使われています。checkout は、「枝の切り替え」だけでなく、「ファイルを元に戻す」など、複数の役割を兼ねていて、初心者には分かりにくいものでした。そこで、2019年ごろ(Git 2.23)に、枝の切り替え専用の git switch が追加されました。この教材では switch を使いますが、git checkout -b 枝の名前 は、git switch -c 枝の名前 と同じ働きです。
6-5. チャレンジ
必須ではありません。実習A・B が終わった状態から、始めます。
新しく枝 try-it を作って移り、main に戻ってください。そして、各枝が、どのコミットを指しているかが分かる一覧を、表示してください。さらに、直前にいた枝へ、一発で戻る方法を、試してください。
ヒント
一覧は git branch に、verbose(くわしく)の -v を付けます。「前の枝」は、switch のあとに、-(ハイフン)だけを付けます。
こたえと解説
git switch -c try-it
git switch main
git branch -v
git switch -
PS C:\work\my-notes> git branch -v * main f1a29e4 Merge branch 'feature-a' try-it f1a29e4 Merge branch 'feature-a' PS C:\work\my-notes> git switch - Switched to branch 'try-it'
git branch -v は、各枝が指す、最新のコミットのIDと、メッセージを見せてくれます。try-it は、作ったばかりなので、main と同じコミットを指しています。git switch - は、直前にいた枝に戻ります。確かめたら、git switch main に戻り、git branch -d try-it で片付けましょう。
次の図は、ある人の履歴です。次の3つに答えてください。
* 9a1c3e5 (HEAD -> main) Merge branch 'fix-typo'
|\
| * 4d7b2f0 (fix-typo) Fix typo in README
* | 8e5a6c1 Add profile page
|/
* 1b2c3d4 Initial commit
- 合流コミットは、どれですか?
- 枝
fix-typoでは、何をしましたか? mainでは、fix-typoが作られたあと、何が足されましたか?
ヒント
合流コミットは、メッセージが Merge branch … で、左側に、枝が2本つながっています。* の位置が、左(main 側)か、右(枝側)かを見ます。
こたえと解説
9a1c3e5(Merge branch 'fix-typo')。2本の流れが合流している、いちばん上のコミットです。- 右の枝(
*が右側)の4d7b2f0。README の誤字を直しました(Fix typo in README)。 - 左側(
main)の8e5a6c1。プロフィールのページを足しました(Add profile page)。
プロフィールのページ作りと、誤字の修正を、お互いに混ざらないように別々に進めて、あとで合流させた様子です。一人で作業しても、複数人で作業しても、同じ形になります。
実習B では、別々のファイル(a.txt と b.txt)を変更しました。今度は、同じファイル hello.txt を、別の枝で変更します。
mainにいる状態で、枝edit-firstを作って移る。hello.txtの1行目を、hello Git!に書き換えて、add・commitする。mainに戻って、hello.txtのいちばん最後に、fourth lineという行を足して、add・commitする。mainで、git merge edit-firstを打つ。メモ帳が開いたら、保存して閉じる。
合流は、うまくいくでしょうか? そのあと、hello.txt の中身は、どうなっていますか?
ヒント
Git は、ファイルを「行」の単位で見ています。変更した行が、離れているか、ぶつかっているかが、ポイントです。
こたえと解説
PS C:\work\my-notes> git merge edit-first Auto-merging hello.txt hint: Waiting for your editor to close the file... unix2dos: converting file C:/work/my-notes/.git/MERGE_MSG to DOS format... dos2unix: converting file C:/work/my-notes/.git/MERGE_MSG to Unix format... Merge made by the 'ort' strategy. hello.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) PS C:\work\my-notes> type hello.txt hello Git! second line third line fourth line
うまくいきます。1行目を変えた変更と、最後に行を足した変更は、別の場所なので、Git が、自動で合わせてくれました(Auto-merging)。
確認クイズ
Q1. ブランチを使うと、どんなよいことがありますか?
思い切って試せる(だめなら main に戻るだけ)。main を、完成した状態に保てる。作業ごとに分けられる。(ほかの人と作業するときは、お互いを邪魔せずに、同時に作業できる。)
Q2. 枝を作って、そこへ移るコマンドは?
git switch -c 枝の名前。(-c は create)
Q3. add-notes を main に合流させるとき、どの枝にいてから、どのコマンドを打ちますか?
合流させたい側の main に、git switch main で移ってから、git merge add-notes を打つ。
Q4. ブランチを切り替えたら、ファイルが消えたように見えました。消えてしまったのですか?
消えていない。作業フォルダの中身が、切り替え先の枝の状態に入れ替わっただけ。元の枝に戻せば、ファイルも戻る。
Q5. 枝を消すとき、-d と -D のどちらを使うべきですか? それはなぜですか?
小文字の -d。合流していない記録が失われる場合は、止めてくれるため。大文字の -D は、警告を無視して強制的に消すので、意味が分かるまで使わない。
話し合おう・考えてみよう
- 一人で作業するとき、どんな作業なら、枝を作りたくなりますか?
mainに直接記録するのと、どう使い分けますか? - ブランチの名前に、どんなルールを決めますか?(例:
作業の内容を表す英語、fix-で始める など) - 「
mainを、完成した状態に保つ」ことは、どんな場面で大切だと思いますか?