-
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ツール
- 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 内部コマンドと外部コマンド
- 10.2 Gitオブジェクト
- 10.3 Git参照
- 10.4 パックファイル
- 10.5 refspec
- 10.6 転送プロトコル
- 10.7 メンテナンスとデータ復旧
- 10.8 環境変数
- 10.9 まとめ
-
付録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 まとめ
-
付録B. アプリケーションへのGitの組み込み
- A2.1 コマンドラインGit
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
付録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 内部コマンド
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)\*.c
のように、パススペックの先頭に:(glob)
または:(literal)
を付けることで、個々のケースでこれを上書きできます。
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は、HTTP経由でネットワーク操作を行うためにcurl
ライブラリを使用するため、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
は、HTTP経由で通信する際にGitが使用するユーザーエージェント文字列を設定します。デフォルトは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つ表示される場合を除き、何も出力しません。
-
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_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コマンドを設定します。コマンドはシェルによって解釈され、ssh
で追加のコマンドライン引数を使用できます(例:GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git@example.com:my/repo
)。
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