ブランチとは何か
このページで分かること
- ブランチを「コミットに貼った付箋」として説明できる
- コミットすると、HEAD が付いているブランチだけが進むことが分かる
git branchとgit log --graph --allでブランチの位置を確かめられる- ブランチを分けると何がうれしいのかが分かる
このページの目次7 items
第3部の19で、ブランチの正体はコミットの ID を1つ書いた41バイトのファイルだと分かりました。ここから第4部です。この正体をもとに、ブランチが何のためにあり、コミットするとどう動くのかを捉え直します。
ブランチは「コミットに貼った付箋」#
ブランチ(branch)は「枝」という意味です。名前からは「履歴を丸ごと複製した別の作業場所」を想像しがちですが、Git のブランチはそうではありません。ブランチは、ある1つのコミットに貼った名前付きの付箋です。
付箋を何枚貼っても、コミットやファイルは1つも増えません。違うのは「どの付箋が、どのコミットに貼ってあるか」だけです。
練習用のリポジトリで、今あるブランチを確かめます。
cd ~/git-practice
git branch* maingit branch は、ブランチの一覧を表示するコマンドです。今は main が1本だけで、先頭の * は「今いるブランチ」、つまり HEAD が付いているブランチを表します(第3部の18)。
ここで付箋を1枚増やします。
git branch idea
git branch idea
* maingit branch 名前 で、今いるコミットに新しいブランチを作れます。作っただけでは移動しないので、* は main に付いたままです。
git log --oneline --decorate -n 1370768c (HEAD -> main, tag: v1.0, idea) ケーキのレシピを追加--decorate は、そのコミットを指している名前を ( ) の中に並べるオプションです。370768c というコミットに、main・idea・タグ v1.0 の3つの名前が付いていることが分かります。HEAD -> main は「HEAD が main に付いている」という意味です。
コミットすると、HEAD が付いているブランチだけが進む#
付箋が2枚ある状態でコミットすると、どちらが動くのでしょうか。
echo "部屋を掃除する" >> todo.txt
git commit -am "やることに掃除を追加"
git log --oneline --decorate --graph --all -n 3* 4e16e23 (HEAD -> main) やることに掃除を追加
* 370768c (tag: v1.0, idea) ケーキのレシピを追加
* 2d6c77c Revert "やることに郵便局を追加"--graph は履歴のつながりを左端の記号で描くオプション、--all は今いるブランチだけでなく、すべてのブランチの履歴を表示するオプションです。ブランチを扱う第4部では、この組み合わせを何度も使います。
新しいコミット 4e16e23 に進んだのは main だけで、idea は1つ前のコミットに残っています。第3部の18で見たとおり、コミットすると、HEAD が付いているブランチの付箋だけが新しいコミットへ貼り替えられます。 ほかのブランチは動きません。
git branch -v を使うと、各ブランチがどのコミットを指しているかを一覧できます。
git branch -v idea 370768c ケーキのレシピを追加
* main 4e16e23 やることに掃除を追加枝分かれ:ブランチが「別の作業場所」になるしくみ#
今は idea にいないので、idea は止まったままです。ここで idea に移ってコミットすると、どうなるでしょうか。idea は C(370768c)から新しいコミットへ進み、main は D(4e16e23)にいるので、同じ C を親に持つ2本の流れができます。これが「枝分かれ」です。
┌─ D ← main
A ─ B ─ C ┤
└─ E ← ideaブランチ自体はただの付箋なのに「別の作業場所」として使えるのは、次の2つが組み合わさっているからです。
- コミットすると、今いるブランチだけが進む(ほかのブランチは影響を受けない)
- ブランチを切り替えると、ワークツリーのファイルがそのブランチのコミットの状態に入れ替わる(次の22で扱います)
この2つのおかげで、main を壊さずに idea で試し、うまくいったら main に取り込み、だめなら idea を捨てる、という使い方ができます。取り込む操作が23のマージです。
ブランチを分けると何がうれしいか#
| 場面 | ブランチがない場合 | ブランチを分けた場合 |
|---|---|---|
| 試しに大きく書き換えたい | 失敗したら戻すのが大変 | ブランチごと捨てれば元どおり |
| 作業の途中で急ぎの修正が入った | 書きかけの変更と混ざる | main に戻って直し、あとで作業を再開できる |
| 複数のことを並行して進めたい | 1本の履歴に入り混じる | 作業ごとに履歴が分かれ、あとで1つずつ取り込める |
ブランチは作るのも消すのも一瞬で、容量もほとんど使いません(第3部の19)。「ちょっと試す」程度のことでも、気軽にブランチを作って構いません。
練習用の idea は、今回は使わないので消しておきます。
git branch -d ideaDeleted branch idea (was 370768c).消えたのは付箋だけで、370768c のコミットは main の履歴として残っています。
よくある疑問#
Q. main は特別なブランチですか?
A. Git にとっては、ほかのブランチと同じただの付箋です。最初に自動で作られるのと、慣習として「完成した、正式な履歴」を置く場所として使われるのが違うだけです。名前は第2部の06の init.defaultBranch で決めたものです。
Q. ブランチを作ると、ファイルがコピーされてフォルダが増えますか?
A. 増えません。フォルダは1つのままで、ブランチを切り替えるとその中身が入れ替わります。複数のブランチを別々のフォルダで同時に開きたいときは、第5部の33の worktree を使います。
まとめ#
- ブランチは、1つのコミットに貼った名前付きの付箋。作ってもファイルやコミットは増えない
git branchで一覧、git branch 名前で今いるコミットに新しいブランチを作る- コミットすると、HEAD が付いているブランチだけが新しいコミットへ進む
- 同じコミットから2本のブランチがそれぞれ進むと、履歴が枝分かれする
git log --oneline --decorate --graph --allで、すべてのブランチの位置とつながりを確かめられる
次のページ#
22. ブランチを作る・切り替える・消す ── git switch でブランチを行き来し、ワークツリーの中身が入れ替わる様子を確かめます。