-
1. Gitを始めるにあたって
- 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ツール
- 7.1 リビジョンの選択
- 7.2 インタラクティブステージング
- 7.3 スタッシュとクリーン
- 7.4 作業に署名する
- 7.5 検索
- 7.6 履歴の書き換え
- 7.7 Resetの解明
- 7.8 高度なマージ
- 7.9 Rerere
- 7.10 Gitを使ったデバッグ
- 7.11 サブモジュール
- 7.12 バンドル
- 7.13 置換
- 7.14 認証情報の保存
- 7.15 まとめ
-
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 PlumbingとPorcelain
- 10.2 Gitオブジェクト
- 10.3 Gitリファレンス
- 10.4 Packfile
- 10.5 Refspec
- 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 Plumbingコマンド
10.8 Gitの内部構造 - 環境変数
環境変数
Gitは常にbash
シェル内で実行され、その動作を決定するために多くのシェル環境変数を使用します。これらの変数が何であり、Gitをどのように動作させるために使用できるかを知っておくと、時々役に立ちます。これはGitが注意を払うすべての環境変数の網羅的なリストではありませんが、最も有用なものを取り上げます。
グローバルな動作
Gitの一般的なコンピュータプログラムとしての動作の一部は、環境変数に依存しています。
GIT_EXEC_PATH
は、Gitがサブプログラム(git-commit
、git-diff
など)を探す場所を決定します。現在の設定はgit --exec-path
を実行することで確認できます。
HOME
は通常、カスタマイズ可能とは見なされませんが(他の多くのものがそれに依存するため)、Gitがグローバルな設定ファイルを探す場所です。グローバルな設定を含む真にポータブルなGitインストールが必要な場合、ポータブルなGitのシェルプロファイルでHOME
をオーバーライドできます。
PREFIX
も同様ですが、システム全体の設定用です。Gitはこのファイルを$PREFIX/etc/gitconfig
で探します。
GIT_CONFIG_NOSYSTEM
は、設定されている場合、システム全体の設定ファイルの使用を無効にします。これは、システム設定がコマンドと競合しているが、それを変更または削除するアクセス権がない場合に役立ちます。
GIT_PAGER
は、コマンドラインで複数ページの出力を表示するために使用されるプログラムを制御します。これが設定されていない場合、PAGER
がフォールバックとして使用されます。
GIT_EDITOR
は、ユーザーがテキスト(コミットメッセージなど)を編集する必要があるときにGitが起動するエディタです。設定されていない場合、EDITOR
が使用されます。
リポジトリの場所
Gitは、現在のリポジトリとどのように連携するかを決定するために、いくつかの環境変数を使用します。
GIT_DIR
は、.git
フォルダーの場所です。これが指定されていない場合、Gitはディレクトリツリーを~
または/
に到達するまで上に辿り、各ステップで.git
ディレクトリを探します。
GIT_CEILING_DIRECTORIES
は、.git
ディレクトリの検索動作を制御します。読み込みが遅いディレクトリ(テープドライブ上のディレクトリや低速なネットワーク接続を介したディレクトリなど)にアクセスする場合、Gitが通常よりも早く検索を停止するようにしたい場合があります。特に、シェルプロンプトを構築するときにGitが呼び出される場合はそうです。
GIT_WORK_TREE
は、ベアではないリポジトリの作業ディレクトリのルートの場所です。--git-dir
またはGIT_DIR
が指定されているが、--work-tree
、GIT_WORK_TREE
、core.worktree
のいずれも指定されていない場合、現在の作業ディレクトリは作業ツリーの最上位とみなされます。
GIT_INDEX_FILE
は、インデックスファイルへのパスです(ベアではないリポジトリのみ)。
GIT_OBJECT_DIRECTORY
は、通常.git/objects
にあるディレクトリの場所を指定するために使用できます。
GIT_ALTERNATE_OBJECT_DIRECTORIES
はコロン区切りのリスト(/dir/one:/dir/two:…
のような形式)で、GIT_OBJECT_DIRECTORY
にオブジェクトがない場合にGitがオブジェクトをどこでチェックするかを指示します。同じ内容を持つ大きなファイルを多数のプロジェクトで持っている場合、これを活用して、それらのコピーを過剰に保存することを避けることができます。
パススペック
「パススペック」とは、Gitでワイルドカードを使用するなどして、パスを指定する方法を指します。これらは.gitignore
ファイルだけでなく、コマンドライン(git add *.c
)でも使用されます。
GIT_GLOB_PATHSPECS
と GIT_NOGLOB_PATHSPECS
は、パススペックにおけるワイルドカードのデフォルトの動作を制御します。GIT_GLOB_PATHSPECS
が1に設定されている場合、ワイルドカード文字はワイルドカードとして機能します(これがデフォルトです)。GIT_NOGLOB_PATHSPECS
が1に設定されている場合、ワイルドカード文字はそれ自体のみにマッチし、*.c
のようなものは、名前が.c
で終わるファイルではなく、"*.c"という名前のファイルのみにマッチします。個々のケースでは、パススペックを:(glob)
または:(literal)
で始めることで、これをオーバーライドできます(例::(glob)\*.c
)。
GIT_LITERAL_PATHSPECS
は、上記の動作を両方とも無効にします。ワイルドカード文字は機能せず、オーバーライドプレフィックスも無効になります。
GIT_ICASE_PATHSPECS
は、すべてのパススペックを大文字小文字を区別しないように設定します。
コミット
Gitコミットオブジェクトの最終的な作成は通常git-commit-tree
によって行われ、これはこれらの環境変数を主要な情報源として使用し、これらの変数が存在しない場合にのみ設定値にフォールバックします。
GIT_AUTHOR_NAME
は、「author」フィールドの人間が読める名前です。
GIT_AUTHOR_EMAIL
は、「author」フィールドのメールアドレスです。
GIT_AUTHOR_DATE
は、「author」フィールドに使用されるタイムスタンプです。
GIT_COMMITTER_NAME
は、「committer」フィールドの人間が読める名前を設定します。
GIT_COMMITTER_EMAIL
は、「committer」フィールドのメールアドレスです。
GIT_COMMITTER_DATE
は、「committer」フィールドのタイムスタンプに使用されます。
EMAIL
は、user.email
設定値が設定されていない場合のフォールバックメールアドレスです。これが設定されていない場合、Gitはシステムユーザー名とホスト名にフォールバックします。
ネットワーキング
Gitはcurl
ライブラリを使用してHTTP経由でネットワーク操作を行うため、GIT_CURL_VERBOSE
はGitにそのライブラリによって生成されたすべてのメッセージを出力するように指示します。これはコマンドラインでcurl -v
を実行するのと似ています。
GIT_SSL_NO_VERIFY
は、GitにSSL証明書を検証しないように指示します。これは、HTTPS経由でGitリポジトリを提供するために自己署名証明書を使用している場合、またはGitサーバーをセットアップしている最中でまだ完全な証明書をインストールしていない場合に、時々必要になることがあります。
HTTP操作のデータレートがGIT_HTTP_LOW_SPEED_LIMIT
バイト/秒より低く、それがGIT_HTTP_LOW_SPEED_TIME
秒より長く続いた場合、Gitはその操作を中止します。これらの値はhttp.lowSpeedLimit
およびhttp.lowSpeedTime
の設定値をオーバーライドします。
GIT_HTTP_USER_AGENT
は、GitがHTTP経由で通信するときに使用するユーザーエージェント文字列を設定します。デフォルトはgit#2.0.0
のような値です。
差分とマージ
GIT_DIFF_OPTS
は少し誤解を招く名前です。有効な値は-u<n>
または--unified=<n>
のみで、git diff
コマンドで表示されるコンテキスト行数を制御します。
GIT_EXTERNAL_DIFF
は、diff.external
設定値のオーバーライドとして使用されます。これが設定されている場合、git diff
が呼び出されたときにGitはこのプログラムを呼び出します。
GIT_DIFF_PATH_COUNTER
と GIT_DIFF_PATH_TOTAL
は、GIT_EXTERNAL_DIFF
またはdiff.external
で指定されたプログラム内から便利です。前者は、一連のファイルでどのファイルが差分されているかを表し(1から始まる)、後者はバッチ内のファイルの総数です。
GIT_MERGE_VERBOSITY
は、再帰的マージ戦略の出力を制御します。許可される値は以下の通りです。
-
0 は、単一のエラーメッセージを除いて、何も出力しません。
-
1 は、競合のみを表示します。
-
2 は、ファイルの変更も表示します。
-
3 は、ファイルが変更されていないためにスキップされたときに表示します。
-
4 は、処理されているすべてのパスを表示します。
-
5 以上は、詳細なデバッグ情報を表示します。
デフォルト値は2です。
デバッグ
Gitが実際に何をしているかを知りたいですか? Gitにはかなり完全なトレースセットが埋め込まれており、それらを有効にするだけで済みます。これらの変数の可能な値は以下の通りです。
-
"true"、"1"、または "2" – トレースカテゴリはstderrに書き込まれます。
-
/
で始まる絶対パス – トレース出力はそのファイルに書き込まれます。
GIT_TRACE
は、特定のカテゴリに当てはまらない一般的なトレースを制御します。これには、エイリアスの展開や他のサブプログラムへの委譲が含まれます。
$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554 trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341 trace: run_command: 'git-lga'
20:12:49.879529 git.c:282 trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349 trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341 trace: run_command: 'less'
20:12:49.899675 run-command.c:192 trace: exec: 'less'
GIT_TRACE_PACK_ACCESS
は、パックファイルアクセスに関するトレースを制御します。最初のフィールドはアクセスされているパックファイル、2番目のフィールドはそのファイル内のオフセットです。
$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
GIT_TRACE_PACKET
は、ネットワーク操作のパケットレベルのトレースを有効にします。
$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46 packet: git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46 packet: git< 0000
20:15:14.867079 pkt-line.c:46 packet: git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git#2.0.4
20:15:14.867088 pkt-line.c:46 packet: git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46 packet: git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]
GIT_TRACE_PERFORMANCE
は、パフォーマンスデータのロギングを制御します。出力は、各特定のgit
呼び出しにかかる時間を示します。
$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414 performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414 performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414 performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414 performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414 performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414 performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414 performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414 performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414 performance: 6.112217000 s: git command: 'git' 'gc'
GIT_TRACE_SETUP
は、Gitが対話しているリポジトリと環境についてGitが何を検出しているかに関する情報を表示します。
$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315 setup: git_dir: .git
20:19:47.087184 trace.c:316 setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317 setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318 setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
その他
GIT_SSH
は、指定されている場合、GitがSSHホストに接続しようとしたときにssh
の代わりに呼び出されるプログラムです。$GIT_SSH [username@]host [-p <port>] <command>
のように呼び出されます。これはssh
の呼び出し方法をカスタマイズする最も簡単な方法ではないことに注意してください。追加のコマンドラインパラメータをサポートしません。追加のコマンドラインパラメータをサポートするには、GIT_SSH_COMMAND
を使用するか、ラッパースクリプトを作成してGIT_SSH
をそれを指すように設定するか、~/.ssh/config
ファイルを使用できます。
GIT_SSH_COMMAND
は、GitがSSHホストに接続しようとしたときに使用されるSSHコマンドを設定します。コマンドはシェルによって解釈され、GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git@example.com:my/repo
のようにssh
で追加のコマンドライン引数を使用できます。
GIT_ASKPASS
は、core.askpass
設定値のオーバーライドです。これは、Gitがユーザーに認証情報を要求する必要があるたびに呼び出されるプログラムで、コマンドライン引数としてテキストプロンプトを期待し、stdout
に回答を返す必要があります(このサブシステムの詳細については資格情報の保存を参照)。
GIT_NAMESPACE
は、名前空間付きのリファレンスへのアクセスを制御し、--namespace
フラグと同等です。これは主にサーバー側で役立ちます。サーバー側では、単一のリポジトリの複数のフォークを1つのリポジトリに保存し、リファレンスのみを分離したい場合があります。
GIT_FLUSH
は、stdoutに増分的に書き込むときにGitに非バッファリングI/Oを使用するように強制するために使用できます。値1はGitに頻繁にフラッシュさせ、値0はすべての出力をバッファリングさせます。デフォルト値(この変数が設定されていない場合)は、アクティビティと出力モードに応じて適切なバッファリングスキームを選択します。
GIT_REFLOG_ACTION
を使用すると、reflogに書き込まれる説明テキストを指定できます。以下に例を示します。
$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'My message'
[master 9e3d55a] My message
$ git reflog -1
9e3d55a HEAD@{0}: my action: My message