ブランチ上のコミット数のカウント

"origin" から分岐した以降に "mybranch" 上で行ったコミットの数を知りたい とします:

$ git log --pretty=oneline origin..mybranch | wc -l

あるいは、下位レベルのコマンド git-rev-list(1) を使用し、 指定したコミットすべての SHA-1 をリスト表示することで行うこともできます:

$ git rev-list origin..mybranch | wc -l

2つのブランチが同じ履歴点にあるかの確認

2つのブランチが同じ履歴点にいるかどうかを確認したいとします。

$ git diff origin..master

この操作により、プロジェクトの中身が2つのブランチで同じであるか どうかを確認できます;しかし、理論的には同じプロジェクト内容が 2つの異なる履歴ルートによって作られることもありえます。 (訳注:コミットIDは違うが中身が一緒の場合もありえる) 従って、オブジェクト名を比較すべきです:

$ git rev-list origin
e05db0fd4f31dde7005f075a84f96b360d05984b
$ git rev-list master
e05db0fd4f31dde7005f075a84f96b360d05984b

あるいは、"…" のオペレータを使用し、一方からのみ到達可能な 全てのコミットを表示してみることです:つまり、

$ git log origin...master

を行い、2つのブランチが等しい時は、コミットが全く表示されません。

与えられた fix を含む最初にタグ付けしたバージョンを探す

e05db0fd がある問題を解決したコミットであるとし、 その解決を含む最も早いタグ付けされたリリースを探したいとします。

もちろん、その答えは1つ以上あります—コミット e05db0fd 以降に 履歴が分岐しているなら、複数の "最も早い" タグ付けされたリリースが存在します。

e05db0fd 以降のコミットを視覚的に調査することで行えます:

$ gitk e05db0fd..

あるいは git-name-rev(1) を使用し、あるタグに基づいた そのコミットの子孫の1つを指し示す名前を表示することができます: (訳注:訳が不正確かな)

$ git name-rev --tags e05db0fd
e05db0fd tags/v1.5.0-rc1^0~23

git-describe(1) コマンドはこれとは反対のことをします。 指定したコミットのベースになるタグ名を使用してそのリビジョンの名前を 表示します。

$ git describe e05db0fd
v1.5.0-rc0-260-ge05db0f

しかし、それは時にはどのタグが指定したコミットの後に現れるかを 推測する手助けになります。

指定したタグ付けされたバージョンが特定のコミットを含むかどうかを 確認したい場合は、git-merge-base(1) を使用します:

$ git merge-base e05db0fd v1.5.0-rc1
e05db0fd4f31dde7005f075a84f96b360d05984b

merge-base コマンドは指定したコミットの共通の祖先を検索し、 一方が他方の子孫である場合にはそのどちらかを表示します; 従って上記出力は e05db0fd が実際に v1.5.0-rc1 の祖先であることを 示しています。

代わりに、

$ git log v1.5.0-rc1..e05db0fd

とすると、v1.5.0-rc1 が e05db0fd を含んでいる場合に限り何も出力をしません、 何故なら v1.5.0-rc1 から到達できないコミットだけが表示されるからです。

As yet another alternative, the git-show-branch(1) command lists the commits reachable from its arguments with a display on the left-hand side that indicates which arguments that commit is reachable from. So, you can run something like (訳注:訳せないので、原文のまま載せます)

$ git show-branch e05db0fd v1.5.0-rc0 v1.5.0-rc1 v1.5.0-rc2
! [e05db0fd] Fix warnings in sha1_file.c - use C99 printf format if
available
 ! [v1.5.0-rc0] GIT v1.5.0 preview
  ! [v1.5.0-rc1] GIT v1.5.0-rc1
   ! [v1.5.0-rc2] GIT v1.5.0-rc2
...

then search for a line that looks like

+ ++ [e05db0fd] Fix warnings in sha1_file.c - use C99 printf format if
available

Which shows that e05db0fd is reachable from itself, from v1.5.0-rc1, and from v1.5.0-rc2, but not from v1.5.0-rc0.

指定したブランチにだけ存在するコミットを表示する

"master" という名前のブランチヘッドから到達可能だが自分のリポジトリ上の 他のヘッドからは到達できないコミットを全て参照したいとします。

git-show-ref(1) を使用するとこのリポジトリの全てのヘッドを 一覧表示できます:

$ git show-ref --heads
bf62196b5e363d73353a9dcf094c59595f3153b7 refs/heads/core-tutorial
db768d5504c1bb46f63ee9d6e1772bd047e05bf9 refs/heads/maint
a07157ac624b2524a059a3414e99f6f44bebc1e7 refs/heads/master
24dbc180ea14dc1aebe09f14c8ecf32010690627 refs/heads/tutorial-2
1e87486ae06626c2f31eaa63d26fc0fd646c8af2 refs/heads/tutorial-fixes

ブランチヘッドの名前を取得し、"master" の行を削除しすることができます。 標準ユーティリティである cut と grep の助けを使用して:

$ git show-ref --heads | cut -d' ' -f2 | grep -v '^refs/heads/master'
refs/heads/core-tutorial
refs/heads/maint
refs/heads/tutorial-2
refs/heads/tutorial-fixes

そして、master から到達可能だがそれ以外のヘッドからは到達できない 全てのコミットをたずねることができます:

$ gitk master --not $( git show-ref --heads | cut -d' ' -f2 |
                                grep -v '^refs/heads/master' )

明らかに、絶え間ない変形もありえます;例えば、いくつかのヘッドからは到達可能だが、 リポジトリ内のどのタグからも到達できないコミットを全て表示するには:

$ gitk $( git show-ref --heads ) --not  $( git show-ref --tags )

(—not のようなコミットを選択する構文の説明は git-rev-parse(1) を参照してください)

チェンジログとソフトウェアリリース用の tarball を作成する

git-archive(1) コマンドはどのプロジェクトのバージョンからも tar 又は zip アーカイブを作成できます;例えば:

$ git archive --format=tar --prefix=project/ HEAD | gzip >latest.tar.gz

これは HEAD を使用し、各ファイルが "project/" が先行する tar アーカイブを 生成します。

ソフトウェアプロジェクトの新しいバージョンをリリースする場合、 リリースアナウンスを含める為、チェンジログを同時に作成したいかもしれません。

Linux Torvalds は例えば、それらにタグを付け、以下を実行することで 新しいカーネルリリースを作ります:

$ release-script 2.6.12 2.6.13-rc6 2.6.13-rc7

ここで、release-script はシェルスクリプトで、以下のような内容です:

#!/bin/sh
stable="$1"
last="$2"
new="$3"
echo "# git tag v$new"
echo "git archive --prefix=linux-$new/ v$new | gzip -9 > ../linux-$new.tar.gz"
echo "git diff v$stable v$new | gzip -9 > ../patch-$new.gz"
echo "git log --no-merges v$new ^v$last > ../ChangeLog-$new"
echo "git shortlog --no-merges v$new ^v$last > ../ShortLog"
echo "git diff --stat --summary -M v$last v$new > ../diffstat-$new"

そして、彼はそれらを確認してOKであることを見た後、単に出力されたコマンドを カット&ペーストします。

指定した中身をもつファイルを参照するコミットを検索する

誰かがあなたにファイルのコピーを手渡し、どのコミットがそのように修正し、 コミットの前または後にそのような内容を含んだのかを問い合わせたとします。 その場合、次のようにしてそれを見つけ出します:

$  git log --raw --abbrev=40 --pretty=oneline |
        grep -B 1 `git hash-object filename`

これが何故動作するかの説明は、(上級の)学生の演習として残しておきます。 git-log(1)git-diff-tree(1) そして、git-hash-object(1) の man ページが理解の助けになります。