Git と GitHub 入門版 0.5.16(ドラフト) ・ 2026-10-24 ・ 作成者 chitchi1216

第6章 / 目安 70〜90分

ブランチ:作業を枝分かれさせる

この章でできるようになること

6-1. ブランチとは

ここまでは、記録(コミット)を、main だけの一本道で積み重ねてきました。第5章で見たとおり、一人で記録を続けるだけなら、それで十分です。この章では、一人でも役に立つ道具として、ブランチを学びます。

ブランチ(branch、枝)を使うと、この道を途中で枝分かれさせて、別々に作業を進められます。

なぜ、枝分かれさせるの? ほかの人と一緒に作業するときにも、ブランチが土台になります(第7章の Pull Request)。まずは、一人で、使い方に慣れましょう。
3f2a9c1 7b1e4d8 c5d2e8a e4f6a1b main add-notes HEAD ブランチは「どのコミットを指しているか」を示す名札。HEAD は「今いる枝」を示す
main は c5d2e8a を、add-notes は1つ先の e4f6a1b を指している。HEAD は add-notes にいる
言葉意味
ブランチ(branch)枝。作業の流れに付ける「名札」。コピーを作るわけではないので、作るのも消すのも、一瞬
mainいちばん基本になる枝。完成した、動く状態を置く
HEAD「今、どの枝にいるか」を示す目印
マージ(merge)別々に進んだ枝を、1つに合流させること

6-2. 実習A:枝を作って、合流させる

第4章で使った my-notes で、notes.txt というファイルを、別の枝で作り、main に合流させます。

打つ前に確認

手順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(作る)の頭文字で、「作ってから、切り替える」という意味です。

「a branch named 'add-notes' already exists」と出たら 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
すでにあるブランチに移るだけなら、-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 が、戻ってきました。ファイルが消えたのではありません。ブランチを切り替えると、作業フォルダの中身が、その枝の状態に入れ替わるのです。

main にいるとき 📄 hello.txt (notes.txt は無い) add-notes にいるとき 📄 hello.txt 📄 notes.txt git switch 同じフォルダの中身が、切り替えるたびに、その枝の状態に入れ替わる
「作業フォルダの見え方」を切り替えるのが、git switch
切り替える前に、git 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 の流れ(まとめ)

  1. git switch -c 枝の名前:枝を作って、移る
  2. 作業して、add → commit
  3. git switch main:合流先(main)に戻る
  4. git merge 枝の名前:合流させる
  5. git branch -d 枝の名前:枝を片付ける
☕ ここで一区切りしてOK 次は「6-3. 実習B」からです。再開するときは、PowerShell を開き、cd C:\work\my-notes で戻ってから、始めてください。

6-3. 実習B:お互いが進んだあとの、合流

実習A では、main が動いていなかったので、「早送り」で済みました。しかし、枝で作業している途中に、急ぎの別の作業(誤字の修正など)を、main で済ませることも、よくあります。すると、合流するまでの間に、main のほうも、進んでいる状態になります。その場合を体験します。

main が動いていない場合 → 早送り(Fast-forward) 合流の前 main add-notes 合流のあと main = add-notes main も進んでいる場合 → 合流コミットを作る b.txt(main) a.txt(feature-a) 合流 2つの流れを、ひとつにまとめる
左:名札を進めるだけ。右:2つの流れを合わせる「合流コミット」ができる

手順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(合わせる)を続けて行うコマンド」と説明しました。ここまで来れば、意味が分かります。

自分の 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 が終わった状態から、始めます。

🎯 チャレンジ1 ★☆☆ 枝の一覧を、くわしく見る。前の枝へ戻る

新しく枝 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 で片付けましょう。

🎯 チャレンジ2 ★★☆ 履歴の図を、読む

次の図は、ある人の履歴です。次の3つに答えてください。

*   9a1c3e5 (HEAD -> main) Merge branch 'fix-typo'
|\
| * 4d7b2f0 (fix-typo) Fix typo in README
* | 8e5a6c1 Add profile page
|/
* 1b2c3d4 Initial commit
  1. 合流コミットは、どれですか?
  2. 枝 fix-typo では、何をしましたか?
  3. main では、fix-typo が作られたあと、何が足されましたか?
ヒント

合流コミットは、メッセージが Merge branch … で、左側に、枝が2本つながっています。* の位置が、左(main 側)か、右(枝側)かを見ます。

こたえと解説
  1. 9a1c3e5(Merge branch 'fix-typo')。2本の流れが合流している、いちばん上のコミットです。
  2. 右の枝(* が右側)の 4d7b2f0。README の誤字を直しました(Fix typo in README)。
  3. 左側(main)の 8e5a6c1。プロフィールのページを足しました(Add profile page)。

プロフィールのページ作りと、誤字の修正を、お互いに混ざらないように別々に進めて、あとで合流させた様子です。一人で作業しても、複数人で作業しても、同じ形になります。

🎯 チャレンジ3 ★★★ 同じファイルを、別の場所で変更して、合流させる

実習B では、別々のファイル(a.txt と b.txt)を変更しました。今度は、同じファイル hello.txt を、別の枝で変更します。

  1. main にいる状態で、枝 edit-first を作って移る。
  2. hello.txt の1行目を、hello Git! に書き換えて、add・commit する。
  3. main に戻って、hello.txt のいちばん最後に、fourth line という行を足して、add・commit する。
  4. 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)。

では、同じ行を変更したら? 同じファイルの、同じ行を、別々の枝で変更すると、Git は、どちらを採用すればよいか決められません。これが「コンフリクト(衝突)」で、第8章で、わざと起こして、解消します。
コマンドの早見表 この章のコマンドは、付録A「よく使うコマンド一覧」にも載せています。

確認クイズ

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 は、警告を無視して強制的に消すので、意味が分かるまで使わない。

話し合おう・考えてみよう