-
1. 使い始める
- 1.1 バージョン管理について
- 1.2 Gitの歴史の概要
- 1.3 Gitとは何か?
- 1.4 コマンドライン
- 1.5 Gitのインストール
- 1.6 Gitの初回セットアップ
- 1.7 ヘルプの取得
- 1.8 まとめ
-
2. Gitの基本
- 2.1 Gitリポジトリの取得
- 2.2 リポジトリへの変更の記録
- 2.3 コミット履歴の表示
- 2.4 元に戻す
- 2.5 リモートでの作業
- 2.6 タグ付け
- 2.7 Gitエイリアス
- 2.8 まとめ
-
3. Gitブランチ
- 3.1 ブランチの概要
- 3.2 ブランチとマージの基本
- 3.3 ブランチ管理
- 3.4 ブランチのワークフロー
- 3.5 リモートブランチ
- 3.6 リベース
- 3.7 まとめ
-
4. サーバー上のGit
- 4.1 プロトコル
- 4.2 サーバーへのGitの導入
- 4.3 SSH公開鍵の生成
- 4.4 サーバーのセットアップ
- 4.5 Gitデーモン
- 4.6 スマートHTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 サードパーティのホスティングオプション
- 4.10 まとめ
-
5. 分散型Git
- 5.1 分散型ワークフロー
- 5.2 プロジェクトへの貢献
- 5.3 プロジェクトの管理
- 5.4 まとめ
-
6. GitHub
- 6.1 アカウントのセットアップと設定
- 6.2 プロジェクトへの貢献
- 6.3 プロジェクトの管理
- 6.4 組織の管理
- 6.5 GitHubのスクリプト化
- 6.6 まとめ
-
7. Gitツール
-
8. Gitのカスタマイズ
- 8.1 Gitの設定
- 8.2 Git属性
- 8.3 Gitフック
- 8.4 Git強制ポリシーの例
- 8.5 まとめ
-
9. Gitと他のシステム
- 9.1 クライアントとしてのGit
- 9.2 Gitへの移行
- 9.3 まとめ
-
10. Gitの内部
- 10.1 プラミングとポーセリン
- 10.2 Gitオブジェクト
- 10.3 Gitリファレンス
- 10.4 パックファイル
- 10.5 リフスペック
- 10.6 転送プロトコル
- 10.7 メンテナンスとデータ復旧
- 10.8 環境変数
- 10.9 まとめ
-
A1. 付録A: 他の環境でのGit
- A1.1 グラフィカルインターフェース
- A1.2 Visual StudioでのGit
- A1.3 Visual Studio CodeでのGit
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMineでのGit
- A1.5 Sublime TextでのGit
- A1.6 BashでのGit
- A1.7 ZshでのGit
- A1.8 PowerShellでのGit
- A1.9 まとめ
-
A2. 付録B: アプリケーションへのGitの組み込み
- A2.1 コマンドラインGit
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. 付録C: Gitコマンド
- A3.1 セットアップと設定
- A3.2 プロジェクトの取得と作成
- A3.3 基本的なスナップショット
- A3.4 ブランチとマージ
- A3.5 プロジェクトの共有と更新
- A3.6 検査と比較
- A3.7 デバッグ
- A3.8 パッチ適用
- A3.9 メール
- A3.10 外部システム
- A3.11 管理
- A3.12 プラミングコマンド
1.1 使い始める - バージョン管理について
この章では、Gitを使い始めることについて説明します。まず、バージョン管理ツールに関する背景を説明し、次にシステムでGitを実行する方法、そして最後にGitを作業開始できるようにセットアップする方法へと進みます。この章の終わりには、Gitが存在する理由、なぜそれを使用すべきなのかを理解し、実際に使用するための準備がすべて整っているはずです。
バージョン管理について
「バージョン管理」とは何か、なぜそれに関心を持つべきなのでしょうか? バージョン管理とは、ファイルまたは一連のファイルに対する変更を時間の経過とともに記録し、後で特定のバージョンを呼び出せるようにするシステムです。本書の例では、バージョン管理されるファイルとしてソフトウェアのソースコードを使用しますが、実際にはコンピューター上のほぼすべての種類のファイルでこれを行うことができます。
グラフィックデザイナーやウェブデザイナーで、画像やレイアウトのすべてのバージョンを保持したい場合(これは間違いなくそうしたいでしょう)、バージョン管理システム(VCS)を使用することは非常に賢明です。VCSを使用すると、選択したファイルを以前の状態に戻したり、プロジェクト全体を以前の状態に戻したり、時間の経過に伴う変更を比較したり、問題を引き起こしている可能性のあるものを最後に変更したのが誰か、いつ誰が問題を引き起こしたかなどを確認したりできます。VCSを使用することは、一般的に、何かを台無しにしたりファイルを紛失したりした場合でも、簡単に復元できることを意味します。さらに、これらすべてを非常に少ないオーバーヘッドで利用できます。
ローカルバージョン管理システム
多くの人が選ぶバージョン管理方法は、ファイルを別のディレクトリ(もし賢ければタイムスタンプ付きのディレクトリ)にコピーすることです。この方法は非常にシンプルであるため一般的ですが、信じられないほどエラーが発生しやすいです。自分がどのディレクトリにいるのかを忘れ、誤って間違ったファイルに書き込んだり、意図しないファイルを上書きしたりすることが簡単に起こります。
この問題に対処するため、プログラマたちはずっと以前から、リビジョン管理下のファイルに対するすべての変更を保持するシンプルなデータベースを持つローカルVCSを開発しました。

最も人気のあるVCSツールの一つは、今日でも多くのコンピューターに配布されているRCSと呼ばれるシステムでした。RCSは、パッチセット(つまり、ファイル間の差分)をディスク上の特殊な形式で保持することで機能します。その後、すべてのパッチを合計することで、任意の時点での任意のファイルの見た目を再作成できます。
集中型バージョン管理システム
人々が次に遭遇する大きな問題は、他のシステム上の開発者と共同作業する必要があることです。この問題に対処するため、集中型バージョン管理システム(CVCS)が開発されました。これらのシステム(CVS、Subversion、Perforceなど)は、すべてのバージョン管理されたファイルを格納する単一のサーバーを持ち、その中央の場所からファイルをチェックアウトする多数のクライアントを持ちます。長年にわたり、これがバージョン管理の標準でした。

この設定は、特にローカルVCSと比較して多くの利点があります。例えば、プロジェクト内の誰もが他のメンバーが何をしているかをある程度把握できます。管理者は誰が何を行うかについて細かく制御でき、すべてのクライアントでローカルデータベースを扱うよりもCVCSを管理する方がはるかに簡単です。
しかし、この設定にはいくつかの重大な欠点もあります。最も明白なのは、集中サーバーが単一障害点となることです。そのサーバーが1時間ダウンした場合、その間は誰も共同作業ができず、作業中のものに対するバージョン管理された変更を保存することもできません。中央データベースのあるハードディスクが破損し、適切なバックアップが取られていなかった場合、プロジェクトの全履歴、つまりローカルマシンに偶然残っている単一のスナップショットを除いて、すべてを完全に失うことになります。ローカルVCSもこの同じ問題を抱えています。プロジェクトの全履歴が単一の場所にある限り、すべてを失うリスクがあります。
分散型バージョン管理システム
ここに分散型バージョン管理システム(DVCS)が登場します。DVCS(Git、Mercurial、Darcsなど)では、クライアントはファイルの最新のスナップショットをチェックアウトするだけでなく、リポジトリをその全履歴を含めて完全にミラーリングします。したがって、もし何らかのサーバーが停止し、これらのシステムがそのサーバーを介して共同作業していたとしても、いずれかのクライアントリポジトリをサーバーにコピーし直して復元することができます。すべてのクローンは、実際にはすべてのデータの完全なバックアップなのです。

さらに、これらのシステムの多くは、複数のリモートリポジトリと連携するのをうまく扱えるため、同じプロジェクト内で異なる人々のグループと異なる方法で同時に共同作業を行うことができます。これにより、集中型システムでは不可能であった階層型モデルなど、いくつかの種類のワークフローを設定することができます。