Gitとは
Git(ギット)は、プログラムの
ソースコードなどの変更履歴を記録・追跡するための分散型
バージョン管理システムです。
Linuxカーネルの
ソースコード管理のためにリーナス・トーバルズによって開発され、多くのプロジェクトで採用されています。特に、
Linuxカーネルのような巨大プロジェクトにも対応できるよう、動作速度が重視されています。現在のメンテナは濱野純氏で、2005年7月から担当しています。
分散型バージョン管理
Gitでは、各ユーザーのローカル環境に、全履歴を含んだ
リポジトリの完全な複製が作成されます。これにより、ネットワークに接続できない環境でも、履歴の調査や変更の記録といったほとんどの作業が可能です。これが「分散型」と呼ばれる理由です。
背景と開発の経緯
Linuxカーネルの開発では、当初、BitKeeperという商用
バージョン管理システムが使われていましたが、
ライセンス問題により利用できなくなりました。その代替として、2005年にGitが開発されました。
Gitは、巨大な
ソースコードの集合を扱う
Linuxカーネル開発で、変更点の抽出や
リポジトリ操作を高速に行う必要性から生まれました。他の
バージョン管理システムでは満足できなかったため、独自のアイデアが導入され、高速な動作と柔軟なブランチ・マージ機能を実現しています。
2018年にMicrosoft社が
GitHubを買収したことにより、
Visual Studio CodeにGitがデフォルトで搭載されるようになりました。
作業の流れ
Gitを使った一般的な開発の流れは以下の通りです。
1.
リポジトリの複製 (git clone): リモート
サーバにある中心
リポジトリをローカル環境に複製します。
2.
変更の記録 (git commit): ローカルでコンテンツの修正・追加・削除を行い、ローカル
リポジトリに変更履歴を記録します。必要に応じて過去の状態の閲覧や復元も行います。
3.
変更の反映 (git push): ローカルの変更内容を中心
リポジトリに反映させます。変更内容が衝突した場合は、Gitが自動で解決するか、手動での解決 (git merge) が必要になります。
4.
最新情報の取得 (git pull): 更新された中心
リポジトリの内容をローカルの複製に反映させ、ローカル環境のコードを最新の状態にします。
リポジトリ間の通信には、ローカル
ファイルシステム、SSH、git、HTTP/
HTTPSなどのプロトコルが使用できます。
GitHubとの通信には、専用の
GitHub CLIが利用可能です。
Gitの設計
Gitの設計は、BitKeeperとMonotoneの影響を受けています。当初はローレベルなエンジンとして設計されていましたが、現在では、Gitのコア自体が直接利用できるようになっています。
設計思想
Gitの設計には、リーナス・トーバルズの大規模プロジェクトのメンテナンス経験、
ファイルシステムの知識、短期間でのシステム構築の必要性が反映されています。具体的には、以下のような特徴があります。
ノンリニアな開発スタイル: ブランチやマージが高速に行え、ノンリニアな開発の履歴を可視化・ナビゲートするツールが用意されています。
分散開発: 各開発者が
リポジトリの完全なコピーをローカルに保持し、変更を他の
リポジトリにコピーできます。
多様なプロトコル: HTTP、FTP、gitプロトコルなど、様々な方法でリポジトリを配布できます。CVSサーバのエミュレーション機能により、既存のCVSクライアントからも利用可能です。
Subversionとの連携: git-svnを使用すれば、Subversionの
リポジトリを直接操作できます。
高速な処理: 大規模プロジェクトでも高速かつスケーラブルに動作します。Mozillaのテストでは、他のバージョン管理システムと比較して、10倍から100倍高速であることが示されました。
ツールキット化された設計:
C言語で書かれたプログラムとシェルスクリプトで構成され、複数のコンポーネントを繋げて複雑な処理を容易に行えます。
プラガブルなマージアルゴリズム: 不完全なマージに対するモデル化と、複数のマージアルゴリズムが実装されています。
Gitのデータモデル
Gitは、ディレクトリツリーに対するスナップショットを作成します。初期のバージョン管理システムとは異なり、個々のファイルではなく、プロジェクト全体の変更履歴を管理します。これにより、ファイル名の変更を明示的に扱わず、履歴のブラウズ時にリネームの検出を行うことで、柔軟な履歴管理が可能になっています。
オブジェクトの保存方法
Gitは、新しく作成されたオブジェクトを個別のファイルとして保存し、後でまとめてパックファイルに格納します。これにより、効率的なストレージ利用と高速なアクセスを両立させています。定期的な再パックによって、不要なデータを削除し、リポジトリのサイズを最適化します。
マージアルゴリズム
Gitには複数のマージアルゴリズムが実装されており、マージ時に選択できます。
resolve: 従来の3-wayマージアルゴリズムを使用します。
recursive: 3-wayマージの変種で、ブランチのmergeやpull時に使用されます。リネームを伴うマージにも対応できます。
octopus: 3つ以上のheadからのマージに使用されます。
歴史
名前の由来
Gitという名前は、
英語のスラングで「バカ」「間抜け」といった意味を持つことから、リーナス・トーバルズの自虐ネタとして付けられました。また、Global Information Trackerの略であるという解釈も存在します。
開発初期
Gitの開発は、BitKeeperの
ライセンス問題がきっかけです。リーナスは、BitKeeperに代わる分散型
バージョン管理システムを探していましたが、要求を満たすものがなかったため、自ら開発を始めました。2005年4月3日に開発が開始され、4月7日にはセルフホスティングされるようになりました。初期のGitは高速な処理を目標としており、開発からわずか数ヶ月で
Linuxカーネルの管理に利用されるようになりました。
BitKeeperからの影響で、Gitは非常にユニークな設計になっています。技術的な部分まではリーナスが開発を行い、その後、濱野純氏にメンテナンスが引き継がれました。
ブランチモデル
ソフトウェア開発におけるGitブランチの作成・更新モデルをブランチモデルと呼びます。
GitHub flowは、masterブランチを常にデプロイ可能な状態に保つことを目的としたブランチモデルです。コードの変更はトピックブランチで行い、pull requestを通じてレビューや自動テストを行い、masterブランチにマージします。これにより、安全なデプロイを実現します。
マージ
Gitはブランチのマージに対応しており、マージを行うとマージコミットが生成されます。コンフリクトが発生した場合は、ユーザーによる手動修正が必要になる場合があります。
関連項目
GitHub
GitLab
バージョン管理システム
arch
Bazaar
BitKeeper
Concurrent Versions System (CVS)
Mercurial
Apache Subversion
外部リンク
Git - 公式ウェブサイト(英語)
Index of /pub/software/scm/git/
Git for Windows - Windows版Gitの配布サイト。(英語)
Pro Git book(英語)
Pro Git book(日本語)