-
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 Smart 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 プラミングコマンド
8.1 Gitのカスタマイズ - Gitの設定
これまでの章では、Gitがどのように動作し、どのように使うのかという基本について説明し、Gitを簡単かつ効率的に使うための様々なツールを紹介しました。この章では、いくつかの重要な設定とフックシステムを導入することで、Gitをよりカスタマイズされた方法で動作させる方法を説明します。これらのツールを使えば、あなた、あなたの会社、またはあなたのグループがGitに求める動作を正確に実現できます。
Gitの設定
Git入門で簡単に読んだように、git config
コマンドを使ってGitの設定を指定できます。最初に行ったことの一つは、自分の名前とメールアドレスを設定することでした。
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
ここでは、この方法で設定できる、より興味深いオプションのいくつかを紹介し、Gitの利用をカスタマイズする方法を学びます。
まず、簡単な復習です。Gitは、ユーザーが望むデフォルト以外の動作を決定するために、一連の設定ファイルを使用します。Gitがこれらの値を探す最初の場所は、システム全体に適用される[path]/etc/gitconfig
ファイルで、これはシステム上のすべてのユーザーとすべてのリポジトリに適用される設定を含みます。git config
に--system
オプションを渡すと、このファイルからのみ読み書きを行います。
Gitが次に探す場所は、ユーザーごとの~/.gitconfig
(または~/.config/git/config
)ファイルです。--global
オプションを渡すと、このファイルに読み書きさせることができます。
最後に、Gitは現在使用しているリポジトリのGitディレクトリ(.git/config
)内の設定ファイルで設定値を探します。これらの値は、その単一のリポジトリに固有のものであり、git config
に--local
オプションを渡すことと等価です。どのレベルで作業するかを指定しない場合、これがデフォルトになります。
これらの「レベル」(システム、グローバル、ローカル)はそれぞれ前のレベルの値を上書きします。したがって、例えば.git/config
の値は[path]/etc/gitconfig
の値を上書きします。
注
|
Gitの設定ファイルはプレーンテキストなので、手動でファイルを編集して正しい構文を挿入することでもこれらの値を設定できます。ただし、一般的には |
基本的なクライアント設定
Gitが認識する設定オプションは、クライアントサイドとサーバーサイドの2つのカテゴリに分類されます。オプションの大部分はクライアントサイドのもので、個人的な作業設定を構成します。非常に多くの設定オプションがサポートされていますが、その大部分は特定の特殊なケースでのみ役立ちます。ここでは、最も一般的で役立つオプションのみを説明します。あなたのGitのバージョンが認識するすべてのオプションのリストを見たい場合は、次のコマンドを実行できます。
$ man git-config
このコマンドは、利用可能なすべてのオプションをかなり詳細にリスト表示します。この参照資料はhttps://git.dokyumento.jp/docs/git-configでも見つけることができます。
注
|
高度なユースケースでは、上記のドキュメントで「Conditional includes」を調べることをお勧めします。 |
core.editor
デフォルトでは、Gitはシェル環境変数VISUAL
またはEDITOR
のいずれかを介してデフォルトのテキストエディタとして設定したものを使用します。設定されていない場合はvi
エディタにフォールバックして、コミットメッセージやタグメッセージを作成・編集します。そのデフォルトを別のものに変更するには、core.editor
設定を使用できます。
$ git config --global core.editor emacs
これで、デフォルトのシェルエディタとして何が設定されていても、GitはEmacsを起動してメッセージを編集します。
commit.template
これをシステム上のファイルのパスに設定すると、Gitはコミット時にそのファイルをデフォルトの初期メッセージとして使用します。カスタムコミットテンプレートを作成する利点は、コミットメッセージを作成する際の適切な形式とスタイルを自分自身(または他の人)に思い出させることができる点です。
たとえば、~/.gitmessage.txt
にある次のようなテンプレートファイルを考えてみましょう。
Subject line (try to keep under 50 characters)
Multi-line description of commit,
feel free to be detailed.
[Ticket: X]
このコミットテンプレートが、コミッターに件名を短く保つこと(git log --oneline
出力のため)、その下に詳細を追加すること、および問題やバグトラッカーのチケット番号が存在する場合はそれに言及することを促している点に注目してください。
git commit
を実行したときにエディタに表示されるデフォルトメッセージとしてこれを使用するようにGitに指示するには、commit.template
設定値を設定します。
$ git config --global commit.template ~/.gitmessage.txt
$ git commit
そうすると、コミット時にエディタはプレースホルダーのコミットメッセージとして次のように開きます。
Subject line (try to keep under 50 characters)
Multi-line description of commit,
feel free to be detailed.
[Ticket: X]
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: lib/test.rb
#
~
~
".git/COMMIT_EDITMSG" 14L, 297C
チームにコミットメッセージのポリシーがある場合、そのポリシーのテンプレートをシステムに置き、Gitがデフォルトでそれを使用するように設定することで、そのポリシーが定期的に遵守される可能性を高めることができます。
core.pager
この設定は、Gitがlog
やdiff
などの出力をページングする際に使用するページャーを決定します。これをmore
や好きなページャーに設定できます(デフォルトではless
です)。または、空の文字列に設定することでオフにすることもできます。
$ git config --global core.pager ''
これを実行すると、Gitはすべてのコマンドの出力を、どんなに長くてもすべて表示します。
user.signingkey
署名付きアノテートタグを作成している場合(作業への署名で説明)、GPG署名キーを設定として指定すると、作業が容易になります。キーIDを次のように設定します。
$ git config --global user.signingkey <gpg-key-id>
これで、git tag
コマンドを使用するたびにキーを指定することなく、タグに署名できます。
$ git tag -s <tag-name>
core.excludesfile
プロジェクトの.gitignore
ファイルにパターンを記述することで、Gitがそれらを未追跡ファイルとして認識したり、git add
を実行したときにステージングしようとしないようにできます。これはファイルの無視で説明しました。
しかし、作業するすべてのリポジトリに対して特定のファイルを無視したい場合があります。お使いのコンピュータがmacOSを実行している場合、.DS_Store
ファイルにはおそらく馴染みがあるでしょう。もし好みのエディタがEmacsやVimであれば、~
や.swp
で終わるファイル名についてご存知でしょう。
この設定により、一種のグローバルな.gitignore
ファイルを作成できます。もし~/.gitignore_global
ファイルに次の内容で作成した場合、
*~
.*.swp
.DS_Store
…そしてgit config --global core.excludesfile ~/.gitignore_global
を実行すると、Gitはそれらのファイルについて二度とあなたを煩わせることはありません。
help.autocorrect
コマンドを誤って入力すると、次のように表示されます。
$ git chekcout master
git: 'chekcout' is not a git command. See 'git --help'.
The most similar command is
checkout
Gitは親切にあなたが何を意図したか推測しようとしますが、それでも実行を拒否します。help.autocorrect
を1に設定すると、Gitは実際にこのコマンドを実行します。
$ git chekcout master
WARNING: You called a Git command named 'chekcout', which does not exist.
Continuing under the assumption that you meant 'checkout'
in 0.1 seconds automatically...
「0.1秒」のことに注目してください。help.autocorrect
は実際には10分の1秒を表す整数です。したがって、これを50に設定すると、Gitは自動修正されたコマンドを実行する前に、あなたが考えを変えるための猶予を5秒与えます。
Gitのカラー表示
Gitはカラフルなターミナル出力を完全にサポートしており、これによりコマンド出力を視覚的に素早く簡単に解析するのに大いに役立ちます。いくつかのオプションは、好みに応じて色を設定するのに役立ちます。
color.ui
Gitはほとんどの出力を自動的に色付けしますが、この動作が気に入らない場合は、マスター設定があります。Gitのすべての色付きターミナル出力をオフにするには、次のようにします。
$ git config --global color.ui false
デフォルト設定はauto
で、これは出力が直接ターミナルに送られる場合は色付けしますが、パイプやファイルにリダイレクトされる場合は色制御コードを省略します。
また、ターミナルとパイプの違いを無視するためにalways
に設定することもできます。これを望むことはほとんどないでしょう。ほとんどのシナリオでは、リダイレクトされた出力にカラーコードが必要な場合は、代わりにGitコマンドに--color
フラグを渡して、カラーコードを使用するように強制することができます。デフォルト設定がほとんどの場合、あなたが望むものとなるでしょう。
color.*
どのコマンドがどのように色付けされるかについてより具体的に指定したい場合は、Gitはコマンド固有の色付け設定を提供します。これらはそれぞれtrue
、false
、またはalways
に設定できます。
color.branch color.diff color.interactive color.status
さらに、これらのそれぞれには、各色を上書きしたい場合に、出力の一部に特定の色の設定を使用できるサブ設定があります。たとえば、diff出力のメタ情報を青い前景、黒い背景、太字のテキストに設定するには、次のように実行できます。
$ git config --global color.diff.meta "blue black bold"
色は、normal
、black
、red
、green
、yellow
、blue
、magenta
、cyan
、またはwhite
のいずれかの値に設定できます。前の例のように太字などの属性が必要な場合は、bold
、dim
、ul
(下線)、blink
、およびreverse
(前景と背景の入れ替え)から選択できます。
外部マージ・差分ツール
Gitには独自のdiffの実装がありますが(本書で示してきたもの)、代わりに外部ツールを設定することもできます。また、手動で競合を解決する代わりに、グラフィカルなマージ競合解決ツールを設定することもできます。ここでは、Perforce Visual Merge Tool(P4Merge)を使って差分表示とマージ解決を行う方法を実演します。これは優れたグラフィカルツールであり、無料で利用できるからです。
これを試したい場合、P4Mergeはすべての主要なプラットフォームで動作するため、利用できるはずです。ここではmacOSおよびLinuxシステムで動作するパス名を使用します。Windowsの場合は、/usr/local/bin
を環境内の実行可能パスに変更する必要があります。
まず、PerforceからP4Mergeをダウンロードしてください。次に、コマンドを実行するための外部ラッパースクリプトを設定します。ここではmacOSの実行可能ファイルのパスを使用します。他のシステムでは、p4merge
バイナリがインストールされている場所になります。すべての引数を指定してバイナリを呼び出すextMerge
というマージラッパースクリプトを設定します。
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/p4merge.app/Contents/MacOS/p4merge $*
diffラッパーは、7つの引数が提供されていることを確認し、そのうちの2つをマージスクリプトに渡します。デフォルトでは、Gitはdiffプログラムに次の引数を渡します。
path old-file old-hex old-mode new-file new-hex new-mode
必要なのはold-file
とnew-file
の引数だけなので、ラッパースクリプトを使って必要なものを渡します。
$ cat /usr/local/bin/extDiff
#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
また、これらのツールが実行可能であることを確認する必要があります。
$ sudo chmod +x /usr/local/bin/extMerge
$ sudo chmod +x /usr/local/bin/extDiff
これで、カスタムのマージ解決ツールと差分ツールを使用するように設定ファイルをセットアップできます。これにはいくつかのカスタム設定が必要です。merge.tool
はGitに使用する戦略を伝え、mergetool.<tool>.cmd
はコマンドの実行方法を指定し、mergetool.<tool>.trustExitCode
はプログラムの終了コードがマージ解決の成功を示しているかどうかをGitに伝え、diff.external
は差分表示に実行するコマンドをGitに伝えます。したがって、4つの設定コマンドを実行するか、
$ git config --global merge.tool extMerge
$ git config --global mergetool.extMerge.cmd \
'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
$ git config --global mergetool.extMerge.trustExitCode false
$ git config --global diff.external extDiff
または、~/.gitconfig
ファイルを編集してこれらの行を追加することもできます。
[merge]
tool = extMerge
[mergetool "extMerge"]
cmd = extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
trustExitCode = false
[diff]
external = extDiff
これらがすべて設定された後、次のような差分コマンドを実行すると、
$ git diff 32d1776b1^ 32d1776b1
コマンドラインで差分出力を得る代わりに、GitはP4Mergeを起動します。これは次のようになります。

2つのブランチをマージしようとしてマージ競合が発生した場合、git mergetool
コマンドを実行できます。これによりP4Mergeが起動し、そのGUIツールを通じて競合を解決できます。
このラッパー設定の利点は、差分ツールとマージツールを簡単に変更できることです。たとえば、extDiff
とextMerge
ツールをKDiff3ツールを実行するように変更するには、extMerge
ファイルを編集するだけです。
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/kdiff3.app/Contents/MacOS/kdiff3 $*
これで、Gitは差分表示とマージ競合解決にKDiff3ツールを使用するようになります。
Gitは、cmd設定を自分で設定しなくても、他の多くのマージ解決ツールを使用できるようにプリセットされています。サポートされているツールのリストを見るには、これを試してください。
$ git mergetool --tool-help
'git mergetool --tool=<tool>' may be set to one of the following:
emerge
gvimdiff
gvimdiff2
opendiff
p4merge
vimdiff
vimdiff2
The following tools are valid, but not currently available:
araxis
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
kdiff3
meld
tkdiff
tortoisemerge
xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.
もしKDiff3を差分表示には使わず、マージ解決のみに使いたい場合で、kdiff3コマンドがパスに含まれているのであれば、次のように実行できます。
$ git config --global merge.tool kdiff3
extMerge
とextDiff
ファイルをセットアップする代わりにこれを実行すると、Gitはマージ解決にKDiff3を使用し、差分表示には通常のGit diffツールを使用します。
フォーマットと空白文字
フォーマットと空白文字の問題は、特にクロスプラットフォームでの共同作業において、多くの開発者が遭遇する、よりイライラする微妙な問題の一部です。エディタが静かに空白文字の変更を導入するため、パッチや他の共同作業で微妙な空白文字の変更が発生することは非常に簡単であり、ファイルがWindowsシステムに触れると、行末が置き換えられる可能性があります。Gitには、これらの問題に対処するためのいくつかの設定オプションがあります。
core.autocrlf
Windowsでプログラミングしており、そうでない人たち(またはその逆)と共同作業している場合、どこかの時点で改行コードの問題に遭遇する可能性があります。これは、Windowsがファイルの改行にキャリッジリターン文字とラインフィード文字の両方を使用するのに対し、macOSやLinuxシステムはラインフィード文字のみを使用するためです。これは微妙ですが、クロスプラットフォーム作業において信じられないほど煩わしい事実です。Windowsの多くのエディタは、既存のLF形式の改行コードをCRLFに自動的に置き換えたり、ユーザーがEnterキーを押したときに両方の改行文字を挿入したりします。
Gitは、ファイルをインデックスに追加する際にCRLF改行コードをLFに自動変換し、その逆にコードをファイルシステムにチェックアウトする際にLFをCRLFに変換することで、この問題に対処できます。この機能はcore.autocrlf
設定で有効にできます。Windowsマシンを使用している場合、これをtrue
に設定します。これにより、コードをチェックアウトする際にLF改行コードがCRLFに変換されます。
$ git config --global core.autocrlf true
LF改行コードを使用するLinuxまたはmacOSシステムを使用している場合、ファイルをチェックアウトする際にGitに自動変換させたくないでしょう。ただし、CRLF改行コードを持つファイルが誤って導入された場合は、Gitに修正させたいかもしれません。コミット時にCRLFをLFに変換し、その逆は行わないようにGitに指示するには、core.autocrlf
をinput
に設定します。
$ git config --global core.autocrlf input
この設定により、WindowsでのチェックアウトではCRLF改行コードが、macOSおよびLinuxシステムではLF改行コードが、そしてリポジトリ内ではLF改行コードが維持されるはずです。
Windowsのみのプロジェクトを行うWindowsプログラマーの場合、この機能をオフにし、設定値をfalse
にすることで、キャリッジリターンをリポジトリに記録できます。
$ git config --global core.autocrlf false
core.whitespace
Gitは、いくつかの空白文字の問題を検出して修正するようにプリセットされています。主に6つの空白文字の問題を検出できます。そのうち3つはデフォルトで有効になっており無効にでき、3つはデフォルトで無効になっていますが有効にできます。
デフォルトで有効になっている3つは、行末のスペースを探すblank-at-eol
、ファイルの末尾の空行を検出するblank-at-eof
、および行頭のタブの前のスペースを探すspace-before-tab
です。
デフォルトで無効になっているが有効にできる3つは、タブの代わりにスペースで始まる行を探すindent-with-non-tab
(tabwidth
オプションで制御されます)、行のインデント部分にあるタブを監視するtab-in-indent
、および行末のキャリッジリターンが問題ないことをGitに伝えるcr-at-eol
です。
core.whitespace
を、有効または無効にしたい値をコンマで区切って設定することで、Gitにどれを有効にしたいかを伝えることができます。オプションを無効にするには、その名前の前に-
を付けます。または、設定文字列から完全に省略することでデフォルト値を使用できます。たとえば、space-before-tab
以外のすべてを設定したい場合は、次のようにできます(trailing-space
はblank-at-eol
とblank-at-eof
の両方をカバーする略称です)。
$ git config --global core.whitespace \
trailing-space,-space-before-tab,indent-with-non-tab,tab-in-indent,cr-at-eol
または、カスタマイズする部分のみを指定することもできます。
$ git config --global core.whitespace \
-space-before-tab,indent-with-non-tab,tab-in-indent,cr-at-eol
git diff
コマンドを実行すると、Gitはこれらの問題を検出し、コミットする前に修正できるように色付けを試みます。また、git apply
でパッチを適用する際にも、これらの値が役立ちます。パッチを適用する際、指定された空白文字の問題があるパッチを適用している場合に、Gitに警告するように要求できます。
$ git apply --whitespace=warn <patch>
または、Gitにパッチを適用する前に問題を自動的に修正させることができます。
$ git apply --whitespace=fix <patch>
これらのオプションは、git rebase
コマンドにも適用されます。空白文字の問題をコミットしたが、まだ upstream にプッシュしていない場合は、git rebase --whitespace=fix
を実行することで、Gitがパッチを書き換える際に空白文字の問題を自動的に修正させることができます。
サーバー設定
Gitのサーバーサイドで利用できる設定オプションはそれほど多くありませんが、注目すべきいくつかの興味深いものがあります。
receive.fsckObjects
Gitは、プッシュ中に受信したすべてのオブジェクトがそのSHA-1チェックサムと一致し、有効なオブジェクトを指していることを確認できます。ただし、デフォルトではこれを行いません。これは非常に負荷の高い操作であり、特に大きなリポジトリやプッシュでは、操作が遅くなる可能性があります。プッシュごとにオブジェクトの一貫性をGitにチェックさせたい場合は、receive.fsckObjects
をtrueに設定することで強制できます。
$ git config --system receive.fsckObjects true
これで、各プッシュが受け入れられる前に、Gitがリポジトリの整合性をチェックし、不正な(または悪意のある)クライアントが破損したデータを導入していないことを確認します。
receive.denyNonFastForwards
すでにプッシュしたコミットをリベースしてから再度プッシュしようとしたり、リモートブランチが現在指しているコミットを含まないコミットをリモートブランチにプッシュしようとしたりすると、拒否されます。これは一般的に良いポリシーですが、リベースの場合、あなたが何をしているかを理解しており、プッシュコマンドに-f
フラグを付けてリモートブランチを強制的に更新できると判断することもあるでしょう。
Gitに強制プッシュを拒否させるには、receive.denyNonFastForwards
を設定します。
$ git config --system receive.denyNonFastForwards true
これを行うもう1つの方法は、後ほど説明するサーバーサイドのreceiveフックを使用することです。このアプローチでは、特定のユーザーのサブセットに対して非fast-forwardを拒否するなど、より複雑なことを行うことができます。
receive.denyDeletes
denyNonFastForwards
ポリシーの回避策の1つは、ユーザーがブランチを削除してから新しい参照で再度プッシュすることです。これを避けるには、receive.denyDeletes
をtrueに設定します。
$ git config --system receive.denyDeletes true
これにより、ブランチやタグの削除がすべて拒否されます。どのユーザーも削除できません。リモートブランチを削除するには、サーバーからrefファイルを手動で削除する必要があります。また、Gitによる強制ポリシーの例で学ぶように、ACLを介してユーザーごとにこれを行うさらに興味深い方法もあります。