-
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 Replace
- 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 パックファイル
- 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コマンド
2.3 Gitの基本 - コミット履歴の表示
コミット履歴の表示
いくつかのコミットを作成した後、または既存のコミット履歴を持つリポジトリをクローンした場合、何が起こったかを確認するために振り返ってみたくなるでしょう。これを行うための最も基本的で強力なツールは、git log
コマンドです。
これらの例では、「simplegit」と呼ばれる非常にシンプルなプロジェクトを使用します。プロジェクトを入手するには、以下を実行します。
$ git clone https://github.com/schacon/simplegit-progit
このプロジェクトでgit log
を実行すると、次のような出力が得られるはずです。
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
デフォルトでは、引数なしでgit log
は、そのリポジトリで行われたコミットを逆時系列順にリストします。つまり、最も新しいコミットが最初に表示されます。ご覧のとおり、このコマンドは各コミットをSHA-1チェックサム、作成者の名前とメール、作成日、およびコミットメッセージとともにリストします。
git log
コマンドには、探しているものを正確に表示するための非常に多くのオプションが用意されています。ここでは、最も一般的なものをいくつか紹介します。
より役立つオプションの1つは、-p
または--patch
で、各コミットで導入された差分(*パッチ*出力)を表示します。また、-2
を使用して最後の2つのエントリのみを表示するなど、表示するログエントリの数を制限することもできます。
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "simplegit"
- s.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
s.summary = "A simple gem for using Git in Ruby code."
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
end
end
-
-if $0 == __FILE__
- git = SimpleGit.new
- puts git.show
-end
このオプションは、同じ情報を表示しますが、各エントリの直後にdiffが付いています。これは、コードレビューや、共同作業者が追加した一連のコミット中に何が起こったかをすばやく確認するのに非常に役立ちます。また、git log
で一連の要約オプションを使用することもできます。たとえば、各コミットの要約統計を表示する場合は、--stat
オプションを使用できます。
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
lib/simplegit.rb | 5 -----
1 file changed, 5 deletions(-)
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
ご覧のとおり、--stat
オプションは、各コミットエントリの下に、変更されたファイルのリスト、変更されたファイル数、およびそれらのファイルに追加および削除された行数を表示します。また、最後に情報の要約を表示します。
もう1つの非常に便利なオプションは--pretty
です。このオプションは、ログ出力をデフォルト以外の形式に変更します。このオプションで使用できるいくつかの事前構築済みのオプション値があります。このオプションのoneline
値は、各コミットを1行で出力します。これは、多数のコミットを見ている場合に役立ちます。さらに、short
、full
、およびfuller
の値は、ほぼ同じ形式で出力を表示しますが、それぞれ情報が少なくなったり、多くなったりします。
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit
最も興味深いオプション値はformat
で、これを使用すると独自のログ出力形式を指定できます。これは、マシン解析用の出力を生成する場合に特に役立ちます。形式を明示的に指定するため、Gitの更新によって形式が変わることはありません。
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit
git log --pretty=format
で使用できる便利な指定子には、format
が受け入れる便利な指定子がいくつかリストされています。
指定子 | 出力の説明 |
---|---|
|
コミットハッシュ |
|
短縮されたコミットハッシュ |
|
ツリーハッシュ |
|
短縮されたツリーハッシュ |
|
親ハッシュ |
|
短縮された親ハッシュ |
|
著者名 |
|
著者のメールアドレス |
|
著者の日付(形式は |
|
著者の日付(相対的) |
|
コミッター名 |
|
コミッターのメールアドレス |
|
コミッターの日付 |
|
コミッターの日付(相対的) |
|
件名 |
著者とコミッターの違いは何だろうと思っているかもしれません。著者はもともと作業を書いた人であり、コミッターは最後に作業を適用した人です。そのため、プロジェクトにパッチを送信し、コアメンバーの1人がパッチを適用すると、あなたもコアメンバーも両方ともクレジットされます。あなたは著者として、コアメンバーはコミッターとしてクレジットされます。この区別については分散Gitで詳しく説明します。
oneline
およびformat
のオプション値は、--graph
という別のlog
オプションを使用すると特に便利です。このオプションは、ブランチとマージの履歴を示す小さなASCIIグラフを追加します。
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of https://github.com/dustin/grit.git
|\
| * 420eac9 Add method for getting the current branch
* | 30e367c Timeout code and tests
* | 5a09431 Add timeout protection to grit
* | e1193f8 Support for heads with slashes in them
|/
* d6016bc Require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
このタイプの出力は、次の章でブランチとマージについて説明するにつれて、より興味深くなります。
これらはgit log
に対するいくつかの簡単な出力形式オプションにすぎません。他にも多くのオプションがあります。git log
の一般的なオプションには、これまで説明したオプションや、役立つ可能性のある他の一般的な形式オプション、およびlog
コマンドの出力をどのように変更するかがリストされています。
オプション | 説明 |
---|---|
|
各コミットで導入されたパッチを表示します。 |
|
各コミットで変更されたファイルの統計情報を表示します。 |
|
|
|
コミット情報の後に、変更されたファイルのリストを表示します。 |
|
追加/変更/削除情報とともに、影響を受けたファイルのリストも表示します。 |
|
SHA-1チェックサム全体(40文字)ではなく、最初の数文字だけを表示します。 |
|
完全な日付形式を使用する代わりに、相対形式(たとえば、「2週間前」)で日付を表示します。 |
|
ログ出力の横に、ブランチとマージの履歴のASCIIグラフを表示します。 |
|
代替形式でコミットを表示します。オプション値には、 |
|
|
ログ出力の制限
出力形式オプションに加えて、git log
は多くの便利な制限オプションを受け入れます。つまり、コミットのサブセットのみを表示できるオプションです。すでにそのようなオプションを1つ見てきました。最後の2つのコミットのみを表示する-2
オプションです。実際には、-<n>
を実行できます。ここで、n
は最後のn
個のコミットを表示する任意の整数です。実際には、Gitはデフォルトですべての出力をページャーに通すため、一度にログ出力の1ページしか表示されないため、それほど頻繁に使用することはありません。
ただし、--since
や--until
などの時間制限オプションは非常に役立ちます。たとえば、このコマンドは、過去2週間に作成されたコミットのリストを取得します。
$ git log --since=2.weeks
このコマンドは多くの形式で機能します。"2008-01-15"
のような特定の日付、または"2 years 1 day 3 minutes ago"
のような相対日付を指定できます。
リストをフィルタリングして、一部の検索条件に一致するコミットにすることもできます。--author
オプションを使用すると特定の著者でフィルタリングでき、--grep
オプションを使用するとコミットメッセージ内のキーワードを検索できます。
注意
|
|
もう1つの非常に役立つフィルターは-S
オプション(一般的にGitの「つるはし」オプションと呼ばれます)で、文字列を受け取り、その文字列の出現回数を変更したコミットのみを表示します。たとえば、特定の関数への参照を追加または削除した最後のコミットを見つけたい場合は、次のように呼び出すことができます。
$ git log -S function_name
フィルターとしてgit log
に渡す最後の本当に便利なオプションはパスです。ディレクトリまたはファイル名を指定すると、ログ出力をそれらのファイルへの変更を導入したコミットに制限できます。これは常に最後のオプションであり、通常はパスをオプションから分離するために二重ダッシュ(--
)が前に付けられます。
$ git log -- path/to/file
git log
の出力を制限するオプションでは、これらのオプションと、参照用の他の一般的なオプションをいくつかリストします。
オプション | 説明 |
---|---|
|
最後のn個のコミットのみを表示します。 |
|
指定された日付より後に作成されたコミットに制限します。 |
|
指定された日付より前に作成されたコミットに制限します。 |
|
著者エントリが指定された文字列に一致するコミットのみを表示します。 |
|
コミッターエントリが指定された文字列に一致するコミットのみを表示します。 |
|
コミットメッセージに文字列を含むコミットのみを表示します。 |
|
文字列に一致するコードを追加または削除するコミットのみを表示します。 |
たとえば、Gitソースコード履歴のテストファイルを変更するコミットのうち、2008年10月にJunio Hamanoによってコミットされ、マージコミットではないものを表示したい場合は、次のようなものを実行できます。
$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch
Gitソースコード履歴の約40,000件のコミットのうち、このコマンドはこれらの条件に一致する6件を表示します。
ヒント
|
マージコミットの表示を防止する
リポジトリで使用されるワークフローによっては、ログ履歴のコミットのかなりの割合が単なるマージコミットである可能性があり、通常はあまり有益ではありません。ログ履歴を乱雑にするマージコミットの表示を防止するには、 |