分散型のバージョン管理システムで、変更履歴をコミット単位で管理する仕組み。
Git(ギット)とは、代表的な分散型バージョン管理システムです。ソースコードの変更履歴を「コミット」という単位で記録し、点をつないだ「コミットツリー」として管理します。
身近な例で考えると、ゲームのセーブデータに似ています。区切りのよいところでセーブ(コミット)しておけば、あとから「あのセーブ地点に戻る」「別のルートを試す」ことができます。Git は、こうしたセーブを何百回でも積み重ねて、いつでも過去の状態を呼び出せる仕組みです。
上のツールで▶ボタンを押すと、ファイルを変更し、add でステージングし、commit で履歴に記録し、branch で分岐して merge で統合するまでの流れを、コミットツリーの変化として確認できます。
Git を使いこなすには、まず次の基本コマンドを覚えるとよいでしょう。
・add:変更をステージング(次のコミットに含める変更として登録)する
・commit:ステージングの内容を履歴に記録する
・branch:分岐(並行作業用の枝)を作る
・merge:分岐した変更を統合する
・push / pull:リモート(共有用のリポジトリ)と履歴を同期する
とくに重要なのが add → commit の2段階です。いきなり履歴に記録するのではなく、まず add で「今回まとめて記録したい変更」を選び、それから commit で確定します。書類を封筒に入れてから提出する、という2ステップだとイメージすると分かりやすいです。
作業を共有するときは push で自分のコミットをリモートに送り、pull で他人のコミットを取り込みます。これにより、複数人が同じプロジェクトを安全に共同編集できます。
Git のような分散型では、各自が履歴を含むリポジトリの完全な複製を手元に持ちます。1つの中央サーバだけが履歴を持つ「集中型」とは、ここが大きく異なります。
この仕組みから、次のような利点が生まれます。
・オフラインでコミットできる:手元に履歴があるため、ネットワークに接続できなくても作業を記録できる
・中央サーバ障害に強い:サーバが止まっても、各自の複製から履歴を復元できる
・ブランチ運用が軽快:分岐や統合が手元で素早く行え、気軽に試せる
それぞれが「完全なコピーを持ち歩く」イメージは、全員が同じ蔵書のコピーを各家庭に持っているようなものです。図書館(中央サーバ)が一時的に閉まっても、誰もが自分の手元の本を読めますし、後で照らし合わせて内容をそろえられます。
ブランチとは、コミット履歴の「分岐」です。本流(多くは main や master ブランチ)から枝を分けて、本流に影響せず並行して作業できます。
なぜブランチが必要か。本流に直接変更を加えると、作りかけの不完全なコードが他の人の作業に影響します。ブランチを使えば「試行錯誤は自分のブランチで、完成したら統合」という流れを作れます。
・feature ブランチ(=機能ブランチ):新しい機能を追加するための作業専用の枝
・マージ:作業が完了したブランチの変更を本流に取り込む操作
身近な例で考えると、本の原稿に直接赤ペンで書き込まずコピーに書き込んで、良ければ反映するのと同じです。コピー(ブランチ)で試せるので、本流(main)はいつでも安定した状態を保てます。上のツールの「branch」「merge」のステップで、この分岐と統合の様子をコミットツリーで確認できます。
バージョン管理には集中型と分散型の2種類があります。Gitは分散型の代表です。
| 項目 | 集中型(例:SVN) | 分散型(例:Git) |
|---|---|---|
| 履歴の場所 | 中央サーバのみ | 各自の手元にも完全コピー |
| オフライン作業 | 基本的に不可 | コミットなど多くの操作が可能 |
| サーバ障害 | 履歴を参照できない | 各自の複製から復元できる |
| ブランチ操作 | 比較的重い | 軽快で気軽に作れる |
なぜ分散型が広まったか。集中型では、中央サーバに接続できない状況や、サーバが止まった時に作業が完全に止まるという弱点がありました。分散型では各自が履歴の完全なコピーを持つため、ネット環境がなくても手元でコミットでき、サーバ障害にも強くなります。
図書館にしかない本(集中型)だと図書館が休館中は読めませんが、各自がコピーを持っている(分散型)なら図書館が閉まっていても読めます。この「自分の手元に完全な履歴がある」という点が分散型の最大の強みです。