「git branch feature/login」——このコマンドを打つとき、なぜ「branch(枝)」という単語を使うのか考えたことがあるだろうか。コードのバージョン管理に「木の枝」のメタファーを持ち込んだのは、実はGitが最初ではない。その歴史は1970年代にまで遡る。
バージョン管理の「木」のメタファーはどこから来たか
コードの変更履歴を管理する「バージョン管理」の概念が生まれたのは1972年。ベル研究所のマーク・ロッチキンドが開発したSCCS(Source Code Control System)が始まりだ。SCCSは変更を時系列に並べる直線的なシステムで、まだ「ブランチ」の概念はなかった。
| VCSの名前 | 登場年 | 開発者 / 組織 | ブランチの扱い |
|---|---|---|---|
| SCCS | 1972 | マーク・ロッチキンド(ベル研) | 直線的な履歴のみ。ブランチなし |
| RCS | 1982 | ウォルター・ティチー(パデュー大) | 「ブランチ」の概念が初登場 |
| CVS | 1990 | ディック・グルーン | 複数人でのブランチ運用に対応 |
| SVN (Subversion) | 2000 | CollabNet | ディレクトリコピーによるブランチ |
| Git | 2005 | リーナス・トーバルズ | 軽量ブランチ。ポインタベース |
1982年に登場したRCS(Revision Control System)で、初めて「branch」という用語が使われた。RCSのマニュアルには、リビジョン番号の分岐を「tree(木)」の構造で説明する図が掲載されている。幹(trunk)から枝(branch)が分かれ、各枝の先端に葉(leaf)がある——という視覚的なモデルだ。
なぜ「木と枝」だったのか
バージョン管理の構造を表すメタファーとして「木と枝」が選ばれた理由は、データ構造の「木構造(tree)」との親和性が高かったからだ。計算機科学では1960年代からtree構造が広く使われていた。ディレクトリ構造もtreeだし、構文解析木もtreeだ。
| バージョン管理の概念 | 木のメタファー | 実際の意味 |
|---|---|---|
| trunk / main | 幹 | メインの開発ライン |
| branch | 枝 | 幹から分岐した開発ライン |
| leaf / HEAD | 葉 / 先端 | ブランチの最新コミット |
| root | 根 | 最初のコミット |
| merge | (枝の接ぎ木) | 分岐した履歴を統合する |
| cherry-pick | さくらんぼ摘み | 特定のコミットだけを選んで取り込む |
面白いのは「merge」だ。現実の木の枝は一度分かれたら二度と合流しない。しかしバージョン管理では枝を「合流」させる操作(merge)が頻繁に行われる。ここでメタファーは現実を超えている。
Gitが「ブランチ」を革命的に変えた
2005年にリーナス・トーバルズがGitを開発したとき、ブランチの実装方法は根本的に変わった。SVNまでのブランチは「ディレクトリのコピー」だったが、Gitのブランチは「コミットを指すポインタ(40バイトのSHA-1ハッシュ)」に過ぎない。
| 特性 | SVN(集中型) | Git(分散型) |
|---|---|---|
| ブランチの作成コスト | 高い(ディレクトリ全体をコピー) | ほぼゼロ(ポインタを作るだけ) |
| ブランチの作成速度 | プロジェクトサイズに比例 | 一瞬(ファイルサイズに無関係) |
| ブランチの切り替え | ネットワークアクセスが必要 | ローカルで即座に完了 |
| ブランチ戦略 | 大きなブランチを長期間維持 | 短命なフィーチャーブランチを頻繁に作成 |
| マージの頻度 | 低い(コストが高いため) | 高い(日常的な操作) |
この軽量さが、GitHubのPull Request文化を生んだ。ブランチを気軽に作れるからこそ、「1機能=1ブランチ=1PR」というワークフローが成立する。
Git用語に隠された比喩の世界
Gitのコマンド名は、よく見ると様々なメタファーが混在している。
| コマンド / 用語 | 直訳 | メタファーの由来 |
|---|---|---|
| branch | 枝 | 木構造(tree metaphor) |
| checkout | 借り出す | 図書館(本を借り出す) |
| commit | 確定する / 委ねる | トランザクション(DBのcommit) |
| stash | 隠す / しまい込む | 日常語(物を棚にしまう) |
| cherry-pick | さくらんぼ摘み | 農業(良いものだけ選ぶ) |
| rebase | 基盤を付け替える | 建築(基礎を据え直す) |
| HEAD | 頭 | テープレコーダー(再生ヘッド) |
| upstream | 上流 | 河川(水は上流から下流へ) |
| fork | 分岐 / フォーク(食器) | 道の分岐(fork in the road) |
| blame | 責める | 日常語(この行を最後に変更した犯人は誰だ) |
「checkout」は図書館で本を借り出すメタファーだし、「blame」は文字通り「犯人探し」だ。「HEAD」はテープレコーダーの再生ヘッドに由来する——現在位置を指すポインタという意味で。
メタファーの限界と新しい試み
木のメタファーは直感的だが、限界もある。「rebase」は木の枝を別の幹に付け替える操作だが、現実の木でそんなことはできない。「detached HEAD」は、文字通りに取ると恐ろしい表現だ。初心者がGitのエラーメッセージに混乱する原因の一つは、メタファーが現実から乖離している場面があることだろう。
Gitの開発者であるトーバルズ自身、Gitのインターフェースが分かりにくいことは認めている。しかし、50年以上にわたって蓄積された「木と枝」のメタファーは、もはやエンジニアの共通言語として定着した。
次に「git branch」を打つとき、1982年にパデュー大学の研究者が初めて「branch」という言葉をバージョン管理に持ち込んだ瞬間を想像してみてほしい。その一語の選択が、40年後の世界中の開発者の日常語になった。私たちが日々使うツールの名前には、それぞれ歴史がある。あなたが次にプロダクトの用語を決めるとき、そのメタファーは50年後にも通用するだろうか。