git rev-parseの使い方!ハッシュ値やGit情報を取得する方法!

Gitを使っていると、「現在のコミットのハッシュ値を取得したい」「Gitリポジトリのルートディレクトリを取得したい」といった場面があります。

例えば、シェルスクリプトやCI/CDからGitの情報を取得して、別の処理で利用したい場合です。

このようなときに使用できるのが、git rev-parseコマンドです。

git rev-parseを使用すると、HEADやブランチ名、タグ名などからハッシュ値を取得したり、Gitリポジトリのルートディレクトリや.gitの場所を取得したりできます。

この記事では、git rev-parseの基本的な意味から、ハッシュ値やGitリポジトリに関する情報を取得する方法、便利なオプションまで初心者向けにわかりやすく解説します。

git rev-parseとは?

git rev-parseとは?

git rev-parseとは、Gitのリビジョンを解析したり、Gitリポジトリに関する情報を取得したりするためのコマンドです。

ここでいう「リビジョン」とは、Gitでコミットなどを指定するための表現です。

例えば、GitではHEAD、main、v1.0.0、a1b2c3dのような値を使用してコミットなどを指定できます。HEADは現在チェックアウトしているコミット、mainはブランチ、v1.0.0はタグ、a1b2c3dのような値は短縮されたハッシュ値です。

例えば、HEADが指しているコミットのハッシュ値を取得する場合は、次のコマンドを実行します。

git rev-parse HEAD

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0

このように、git rev-parseにリビジョンを指定すると、対応するGitオブジェクトのオブジェクトIDを取得できます。また、ハッシュ値の取得だけでなく、Gitリポジトリのルートディレクトリを取得したり、現在のディレクトリがGitワークツリー内にあるか確認したりすることもできます。

git rev-parseでハッシュ値を取得する

git rev-parseの代表的な使い方が、指定したリビジョンからハッシュ値を取得する方法です。基本的には、次のように使用します。

git rev-parse <リビジョン>

<リビジョン>には、HEAD、ブランチ名、タグ名、ハッシュ値などを指定できます。

例えば、HEAD、mainブランチ、v1.0.0タグのハッシュ値を取得する場合は、次のコマンドを実行します。

git rev-parse HEAD
git rev-parse main
git rev-parse v1.0.0

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0
e8f7a3c0123456789abcdef0123456789abcdef0
a12bc34de56789f0123456789abcdef012345678

短縮ハッシュから完全なハッシュ値を取得する

git rev-parseには、短縮されたハッシュ値を指定することもできます。例えば、e8f7a3cという短縮ハッシュから完全なハッシュ値を取得する場合は、次のコマンドを実行します。

git rev-parse e8f7a3c

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0

Gitが短縮ハッシュから対象のオブジェクトを一意に特定できれば、完全なオブジェクトIDが表示されます。

--shortで短縮したハッシュ値を取得する

完全なハッシュ値ではなく、短縮されたハッシュ値を取得したい場合は--shortオプションを使用します。例えば、HEADが指しているコミットの短縮ハッシュを取得する場合は、次のコマンドを実行します。

git rev-parse --short HEAD

# 実行結果
e8f7a3c

また、--shortの後ろには、完全なハッシュ値を直接指定することもできます。例えば、次のコマンドを実行します。

git rev-parse --short e8f7a3c0123456789abcdef0123456789abcdef0

# 実行結果
e8f7a3c

つまり、次のように相互に変換できます。

やりたいことコマンド
短縮ハッシュ → 完全なハッシュgit rev-parse e8f7a3c
完全なハッシュ → 短縮ハッシュgit rev-parse --short e8f7a3c0123456789abcdef0123456789abcdef0

短縮ハッシュの文字数を指定する

--short=<文字数>と指定すると、短縮ハッシュの最低文字数を指定できます。例えば、12文字を指定する場合は、次のコマンドを実行します。

git rev-parse --short=12 HEAD

# 実行結果
e8f7a3c01234

Gitはオブジェクトを一意に識別できる短縮オブジェクトIDを生成するため、単純にハッシュ値の先頭を指定した文字数だけ切り取っているわけではなく、必要な場合は指定した文字数より長くなることがあります。

--symbolicで指定したリファレンスをそのまま表示する

通常のgit rev-parseでは、ブランチ名などを指定すると対応するハッシュ値が表示されます。例えば、次のコマンドを実行します。

git rev-parse main

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0

一方、--symbolicオプションを使用すると、入力されたリファレンスを可能な限り元の形式に近い形で表示できます。

git rev-parse --symbolic main

# 実行結果
main

ハッシュ値を指定した場合は、ブランチ名などへ変換されるわけではありません。

git rev-parse --symbolic e8f7a3c

# 実行結果
e8f7a3c

--symbolicは、リファレンスをハッシュ値へ変換せずに扱いたい場合に使用できます。

--abbrev-refで現在のブランチ名を取得する

現在のブランチ名を取得したい場合は、--abbrev-refとHEADを組み合わせる方法があります。例えば、次のコマンドを実行します。

git rev-parse --abbrev-ref HEAD

# 実行結果
main

現在チェックアウトしているブランチがmainであれば、mainと表示されます。シェルスクリプトなどで現在のブランチ名を取得するときにも利用できます。

BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)

echo "$BRANCH_NAME"

特定のブランチではなくコミットを直接チェックアウトしているdetached HEADの状態では、通常のブランチ名ではなくHEADと表示されます。

例えば、コミットのハッシュ値を指定してチェックアウトし、git rev-parse --abbrev-ref HEADを実行します。

git checkout e8f7a3c
git rev-parse --abbrev-ref HEAD

# 実行結果
HEAD

このように、detached HEADの状態では、git rev-parse --abbrev-ref HEADを実行してもブランチ名は取得できず、HEADと表示されます。

単純に現在のブランチ名を取得したい場合

単純に現在のブランチ名を取得したい場合は、git branch --show-currentを使用する方法もあります。

例えば、現在のブランチがmainの場合は、次のコマンドを実行します。

git branch --show-current

# 実行結果
main

git branch --show-currentは、現在チェックアウトしているブランチ名を表示するコマンドです。なお、detached HEADの状態で実行した場合は、ブランチ名が存在しないため何も表示されません。

--show-toplevelでGitワークツリーのルートディレクトリを取得する

--show-toplevelオプションを使用すると、Gitワークツリーのルートディレクトリを取得できます。例えば、次のようなディレクトリ構成があるとします。

/home/user/project/
├── .git/
├── README.md
└── src/
    └── components/

/home/user/project/src/componentsにいる状態で、次のコマンドを実行します。

git rev-parse --show-toplevel

# 実行結果
/home/user/project

現在いるサブディレクトリではなく、Gitワークツリーのルートである/home/user/projectが表示されます。そのため、シェルスクリプトなどで「どのサブディレクトリから実行してもGitワークツリーのルートを基準に処理したい」といった場合に便利です。

例えば、次のようにするとGitワークツリーのルートディレクトリへ移動できます。

cd "$(git rev-parse --show-toplevel)"

--show-prefixでルートから現在位置までの相対パスを取得する

--show-prefixオプションを使用すると、Gitワークツリーのルートから現在のディレクトリまでの相対パスを取得できます。例えば、/home/user/project/src/componentsで次のコマンドを実行します。

git rev-parse --show-prefix

# 実行結果
src/components/

Gitワークツリーのルートである/home/user/projectから現在位置までの相対パスが表示されます。Gitワークツリーのルートで実行した場合は、空文字列が出力されます。

--show-cdupで現在位置からルートまでの相対パスを取得する

--show-cdupオプションを使用すると、現在のディレクトリからGitワークツリーのルートへ戻るための相対パスを取得できます。例えば、/home/user/project/src/componentsで次のコマンドを実行します。

git rev-parse --show-cdup

# 実行結果
../../

現在位置から../../と移動すれば、Gitワークツリーのルートへ戻れることを表しています。--show-prefixと--show-cdupの違いをまとめると、次のようになります。

オプション取得するパス出力例
--show-prefixGitワークツリーのルート → 現在位置src/components/
--show-cdup現在位置 → Gitワークツリーのルート../../

--git-dirでGitディレクトリの場所を取得する

--git-dirオプションを使用すると、Gitがリポジトリの管理情報を保存しているGitディレクトリの場所を取得できます。例えば、Gitリポジトリのルートで次のコマンドを実行します。

git rev-parse --git-dir

# 実行結果
.git

現在のGitでは、--git-dirの出力は実行場所や設定によって相対パスになる場合があります。絶対パスでGitディレクトリを取得したい場合は、--absolute-git-dirを使用できます。

git rev-parse --absolute-git-dir

# 実行結果
/home/user/project/.git

通常のGitリポジトリでは.gitディレクトリに管理情報が保存されていますが、Git worktreeやサブモジュールなどでは構造が異なる場合があります。そのため、スクリプトからGitディレクトリを参照するときは、.gitというパスを固定で指定するのではなく、git rev-parse --git-dirなどから取得できます。

--resolve-git-dirでGitディレクトリか確認する

--resolve-git-dirオプションを使用すると、指定したパスが有効なGitディレクトリ、または有効なGitリポジトリを指すgitfileであるか確認できます。例えば、.gitを指定して次のコマンドを実行します。

git rev-parse --resolve-git-dir .git

# 実行結果
.git

Gitディレクトリとして解決できないパスを指定するとエラーになります。

git rev-parse --resolve-git-dir sample

# 実行結果
fatal: not a gitdir 'sample'

また、指定したパスが実際のGitディレクトリを指すgitfileの場合は、解決されたGitディレクトリのパスが表示されます。

--is-inside-work-treeでGitワークツリー内か確認する

--is-inside-work-treeオプションを使用すると、現在のディレクトリがGitワークツリー内かどうかを確認できます。例えば、Gitワークツリー内で次のコマンドを実行します。

git rev-parse --is-inside-work-tree

# 実行結果
true

trueと表示された場合は、現在のディレクトリがGitワークツリー内であることを表します。シェルスクリプトなどでGitワークツリー内から実行されているか確認したい場合に利用できます。

Gitがリポジトリを認識できない場所では、単純にfalseが表示されるとは限らず、エラーになる場合があります。

--is-bare-repositoryでbareリポジトリか確認する

--is-bare-repositoryオプションを使用すると、対象のGitリポジトリがbareリポジトリかどうかを確認できます。例えば、通常のGitリポジトリで次のコマンドを実行します。

git rev-parse --is-bare-repository

# 実行結果
false

falseの場合はbareリポジトリではなく、trueの場合はbareリポジトリです。bareリポジトリとは、通常の作業ファイルを展開するワークツリーを持たず、主にGitのリポジトリデータを管理するためのリポジトリです。

--allですべてのリファレンスを取得する

--allオプションを使用すると、refs/以下にあるすべてのリファレンスが指すオブジェクトIDを取得できます。例えば、次のコマンドを実行します。

git rev-parse --all

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0
4a12bc3456789abcdef0123456789abcdef01234
7cd89ef0123456789abcdef0123456789abcdef

ブランチ、タグ、リモート追跡ブランチなどに対応するリファレンスをまとめて扱いたい場合に使用できます。

--branchesでブランチのリファレンスを取得する

--branchesオプションを使用すると、ローカルブランチのリファレンスが指すオブジェクトIDを取得できます。例えば、次のコマンドを実行します。

git rev-parse --branches

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0
4a12bc3456789abcdef0123456789abcdef01234

複数のローカルブランチが存在する場合は、それぞれが指すオブジェクトIDが表示されます。

--tagsでタグのリファレンスを取得する

--tagsオプションを使用すると、タグのリファレンスが指すオブジェクトIDを取得できます。例えば、次のコマンドを実行します。

git rev-parse --tags

# 実行結果
7cd89ef0123456789abcdef0123456789abcdef

複数のタグが存在する場合は、それぞれが指すオブジェクトIDが表示されます。

--remotesでリモート追跡ブランチのリファレンスを取得する

--remotesオプションを使用すると、リモート追跡ブランチのリファレンスが指すオブジェクトIDを取得できます。例えば、次のコマンドを実行します。

git rev-parse --remotes

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0

--all、--branches、--tags、--remotesの違いをまとめると、次のようになります。

オプション対象
--allrefs/以下のすべてのリファレンス
--branchesローカルブランチ
--tagsタグ
--remotesリモート追跡ブランチ

なお、これらのオプションで表示されるのは基本的にブランチ名やタグ名そのものではなく、それぞれのリファレンスが指すオブジェクトIDです。

--verifyで指定したリビジョンを確認する

--verifyオプションを使用すると、指定した値を1つのオブジェクトとして解決できるか確認できます。例えば、HEADを確認する場合は次のコマンドを実行します。

git rev-parse --verify HEAD

# 実行結果
e8f7a3c0123456789abcdef0123456789abcdef0

正常に解決できれば、そのオブジェクトIDが表示されます。存在しないブランチ名などを指定した場合はエラーになります。

エラーメッセージを表示せず、終了ステータスで判定したい場合は--quietまたは-qを組み合わせることもできます。

git rev-parse --verify --quiet feature

シェルスクリプトなどで、指定したリビジョンが存在するか確認したい場合に便利です。

git rev-parseの主なオプション一覧

ここまで紹介した主な使い方をまとめると、次のようになります。

コマンド内容
git rev-parse HEADHEADが指すコミットのハッシュ値を取得する
git rev-parse <短縮ハッシュ>短縮ハッシュから完全なハッシュ値を取得する
git rev-parse --short <リビジョン>短縮されたハッシュ値を取得する
git rev-parse --symbolic <リビジョン>入力を可能な限り元の形式に近い形で表示する
git rev-parse --abbrev-ref HEAD現在のブランチ名を取得する
git rev-parse --show-toplevelGitワークツリーのルートディレクトリを取得する
git rev-parse --show-prefixルートから現在位置までの相対パスを取得する
git rev-parse --show-cdup現在位置からルートまでの相対パスを取得する
git rev-parse --git-dirGitディレクトリの場所を取得する
git rev-parse --absolute-git-dirGitディレクトリを絶対パスで取得する
git rev-parse --resolve-git-dir <パス>Gitディレクトリまたはgitfileを解決する
git rev-parse --is-inside-work-treeGitワークツリー内か確認する
git rev-parse --is-bare-repositorybareリポジトリか確認する
git rev-parse --allrefs/以下のすべてのリファレンスを取得する
git rev-parse --branchesローカルブランチが指すオブジェクトIDを取得する
git rev-parse --tagsタグのリファレンスを取得する
git rev-parse --remotesリモート追跡ブランチのリファレンスを取得する
git rev-parse --verify <リビジョン>指定したリビジョンをオブジェクトとして解決できるか確認する

git rev-parseはどのようなときに使う?

git rev-parseは、Gitが持っている情報をシェルスクリプトやCI/CDなどから取得したい場合に便利です。

例えば、現在のコミットの短縮ハッシュ値を変数へ保存する場合は、次のように記述できます。

COMMIT_HASH=$(git rev-parse --short HEAD)

echo "$COMMIT_HASH"

Gitワークツリーのルートディレクトリを変数へ保存する場合は、次のように記述できます。

ROOT_DIR=$(git rev-parse --show-toplevel)

echo "$ROOT_DIR"

現在のブランチ名を変数へ保存することもできます。

BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)

echo "$BRANCH_NAME"

このように、git rev-parseはGitの情報を画面で確認するだけでなく、取得した情報を別のコマンドやスクリプトで利用したい場合にも役立ちます。

git rev-parseを使うときの注意点

git rev-parseの一部の機能は、Gitリポジトリを認識できる場所で実行する必要があります。

例えば、Gitリポジトリ外でgit rev-parse --show-toplevelやgit rev-parse HEADを実行すると、Gitリポジトリを認識できないためエラーになります。

また、git rev-parse --abbrev-ref HEADは通常であれば現在のブランチ名を取得できますが、detached HEADの状態ではHEADと表示されます。

さらに、短縮ハッシュを指定する場合は、その値から対象のGitオブジェクトを一意に特定できる必要があります。

シェルスクリプトやCI/CDでgit rev-parseを使用する場合は、常に期待した値が取得できるとは限らないことも考慮して使用するとよいでしょう。

本記事のまとめ

この記事では「git rev-parse」について、以下の内容を説明しました。

  • git rev-parseは、Gitのリビジョンを解析したり、Gitリポジトリに関する情報を取得したりするためのコマンド
  • HEAD、ブランチ名、タグ名などからハッシュ値を取得でき、短縮ハッシュと完全なハッシュ値の変換もできる
  • --show-toplevel、--show-prefix、--show-cdupなどでGitワークツリーのパスに関する情報を取得できる
  • --git-dir、--is-inside-work-tree、--is-bare-repositoryなどでGitリポジトリに関する情報を確認できる
  • --all、--branches、--tags、--remotesなどでリファレンスが指すオブジェクトIDを取得できる

お読みいただきありがとうございました。

スポンサーリンク