Gitの現在のコミットのハッシュを取得するにはどうすればよいですか?


1934

(今のところ)GitチェンジセットをTFSに保存されているワークアイテムにリンクする機能を保持したいと思います。

Gitチェンジセットのメッセージにworkitemidentifiersを挿入できるツール(Gitのフックを使用)はすでに作成しました。

ただし、Gitコミットの識別子(ハッシュ)をカスタムTFS作業項目フィールドに格納したいと思います。この方法で、TFSの作業項目を調べて、どのGitチェンジセットが作業項目に関連付けられているかを確認できます。

Gitからの現在のコミットからハッシュを簡単に取得するにはどうすればよいですか?

回答:


2810

任意の拡張オブジェクト参照をSHA-1に変換するには、単にgit-rev-parseを使用します。次に例を示します。

git rev-parse HEAD

または

git rev-parse --verify HEAD

追記:あなたがオンにする場合の参照タグを SHA-1に)、そこにあるgit show-refgit for-each-ref


81
--verifyそれは意味:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
ライナスUnnebäck

648
git rev-parse --short HEAD誰かが疑問に思っている場合に備えて、ハッシュの短いバージョンを返します。
Thane Brimhall、

55
セインが言ったことに加えて、あなたはまた、特定の長さを追加することができる--shortよう、--short=12ハッシュからの数字の特定の番号を取得するには、。
Tyson Phalp 14

32
@TysonPhalpは:--short=Nについてです最小限の桁数。短い方が他のコミットの短縮と区別がつかない場合、gitはより多くの桁を使用します。例:git rev-parse --short=2 HEADまたはを試してくださいgit log --oneline --abbrev=2
JakubNarębski、2014

36
Thane、Tyson、およびJakubの発言に加えて、完全なハッシュを印刷できますが、コミットブルーを識別するために必要なヘキシットを強調表示しますgit rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Zaz

424

短縮されたハッシュのみが必要な場合:

git log --pretty=format:'%h' -n 1

さらに、%Hを使用することは、長いハッシュを取得する別の方法です。


107
または、上記のrev-parseコマンドに--shortを追加しても機能するようです。
outofculture 2011

15
git log磁器だと思いますgit rev-parse
Amedee Van Gasse、2016年

このメソッドの利点の1つは、より大きなリポジトリで発生するハッシュの衝突に合わせて適切な長さが調整された短いバージョンのハッシュを返すことです。少なくとも最近のバージョンのgitでは。
Ilia Sidorenko 2016

4
この方法では、ヘッドが切り離されている場合に誤ったハッシュが返されるため、これは不適切な方法です。たとえば、現在のコミットが12ab34で、以前のコミットが33aa44だった場合、「git checkout 33aa44」を実行してコマンドを実行すると、実際に頭を指しても12ab34が返されます。 33aa44に...
theQuestionMan

3
@theQuestionMan私はあなたが述べる行動を経験しません。git checkout 33aa44; git log -n 1くれ33aa44ます。使用しているgitのバージョンは何ですか?
outofculture 2017

150

もう1つは、git logを使用します。

git log -1 --format="%H"

@outofcultureのそれに非常に似ていますが、少し短いです。


結果は単一引用符で囲まれていません。
crokusek 2017

5
これは正しい答えです。なぜなら、特定のコミットをチェックアウトした場合でも機能するからですHEAD
パルサ

1
@Parsa:特定のチェックアウト時にコミットHEADこれまでのポイントは、などという名前BRANCHEのノウハウではなく、コミット切り離さヘッド
ChristofSenn

125

完全なSHAを取得するには:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

短縮バージョンを取得するには:

$ git rev-parse --short HEAD
cbf1b9a

2つの場合git commitのハッシュが必要とされている、などから一人としてbranch、あなたは、現在作業しているとmaster branch、あなたも使用することができgit rev-parse FETCH_HEAD、あなたがのためにハッシュ必要がある場合はmaster commit、あなたがいることをmerge、あなたの現在の研究開発をbranch。例えばあなたが持っている場合はbranch、ESをmasterし、feature/new-feature与えられたレポのために、上の間、feature/new-featureあなたが使用することができgit fetch origin master && git merge FETCH_HEAD、その後git rev-parse --short FETCH_HEAD、あなたは、必要に応じてcommitからハッシュmasterあなただけmergeのD任意のスクリプトのためにあなたが持つかもしれないが。
EVAL

72

完全を期すため、まだ誰も提案していないため。 .git/refs/heads/masterは、1行だけが含まれているファイルです:の最新コミットのハッシュmaster。だから、そこから読むことができます。

または、コマンドとして:

cat .git/refs/heads/master

更新:

gitは、/ refs / heads /フォルダー内のファイルとしてではなく、pack-refファイルにいくつかのヘッド参照の保存をサポートするようになりました。 https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html


10
これは、現在のブランチがmasterであることを前提としていますが、必ずしもそうではありません。
ガブリエ12/10/23

12
確かに。これが私がこれがのためであると明示的に言った理由ですmaster
Deestan 2012年

20
.git/HEAD通常はrefを指し、そこにSHA1がある場合は、分離ヘッドモードになります。
eckes 2013

8
これは、他のアプローチと比較して非常に堅牢ではありません。特に、.gitサブディレクトリがあることを前提としているため、必ずしもそうとは限りません。manページの--separate-git-dirフラグを参照してgit initください。
jub0bs 2014

16
+1 git実行可能ファイル(Dockerfileなど)をインストールしたくない場合があるため
wim

50

ハッシュをコミットする

git show -s --format=%H

短縮されたコミットハッシュ

git show -s --format=%h

クリックしてここに多くのためgit showの例。


50

常にありgit describeます。デフォルトでは次のようになります-

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75

18
Git describeは、コミットから到達可能な最初のTAGを返します。これはどのようにしてSHAを取得するのに役立ちますか?
Sardaukar、2011

42
7.2.0.Finalタグの後の447のコミットと、現在のHEADでのグローバルSHA-1の最初の10ダイジェストが "65bf4ef2d4" git describe --long --dirty --abbrev=10 --tagsになるようなものが好き7.2.0.Final-447-g65bf4ef2d4です。これはバージョン文字列に非常に適しています。--longを使用すると、タグが完全に一致した場合でも、常にカウント(-0-)とハッシュが追加されます。
eckes 2013

14
タグが存在しない場合、git describe --always「一意に省略されたコミットオブジェクトをフォールバックとして表示する」
Ronny Andersson 2014

使用しますgit describe --tags --first-parent --abbrev=11 --long --dirty --always。この--alwaysオプションは、タグがない場合でも結果(ハッシュ)を提供することを意味します。--first-parent手段は、マージコミットで混乱とだけ現在のブランチ上の項目を次のされません。また、現在のブランチにコミットされていない変更がある場合は、結果に--dirty追加-dirtyされます。
ingyhere

30

使用する git rev-list --max-count=1 HEAD


3
git-rev-listは、コミットオブジェクトのリストの生成に関するものです。オブジェクト名(HEADなど)をSHA-1に変換するのはgit-rev-parseです
JakubNarębskiJun

21

スクリプトの実行中にハッシュを変数に格納する必要がある場合は、

last_commit=$(git rev-parse HEAD)

または、最初の10文字のみが必要な場合(github.comのように)

last_commit=$(git rev-parse HEAD | cut -c1-10) 

26
--shortまたはの--short=numberパラメータもありますgit rev-parse。パイプを使用する必要はありませんcut
ジュリアンD.

15

超ハッキーな方法でそれをしたい場合:

cat .git/`cat .git/HEAD | cut -d \  -f 2`

基本的に、gitはHEADの場所を.git / HEADにの形式で格納しますref: {path from .git}。このコマンドはそれを読み取り、「ref:」を切り取り、それが指しているファイルをすべて読み取ります。

もちろん、ヘッドは「ref:...」ではないので、デタッチドヘッドモードでは失敗しますが、ハッシュ自体ですが、bashでそれほど賢いとは思わないでしょう。 -ライナー。セミコロンがだまされているとは思わないのなら...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH

1
gitをインストールする必要はありません。(私のdockerビルドイメージにはgitがありません)
Helin Wang

これはgitリポジトリの外部から簡単に実行できるため、便利です
samaspin

これをローカルマシン用のスクリプトに形式化しました。次に、ちょっと、私が考えたのは、私が作成した実装は、無関係な問題(外部プログラムなしのPOSIXシェルスクリプトの引数の解析)を解決する方法を示すほど単純ですが、少しのバリエーションを提供し、ほとんどのの機能sh。ハーフ以降のドキュメントコメントの時間、そしてここでの要点です:gist.github.com/Fordi/29b8d6d1ef1662b306bfc2bd99151b07
Fordi

それを見て、GitとSVNを検出し、git hash / svnリビジョンを取得するためのより広範なバージョンを作成しました。ないきれいな文字列この時間が、簡単にコマンドラインが解析され、バージョンタグとして使用可能: gist.github.com/Fordi/8f1828efd820181f24302b292670b14e
Fordi

14

私が知っている最も簡潔な方法:

git show --pretty=%h 

ハッシュの特定の桁数が必要な場合は、次を追加できます。

--abbrev=n

14
これは技術的には機能しますgit showが、磁器コマンド(つまり、ユーザー向け)と呼ばれるものであり、出力は変更される可能性があるため、スクリプトでは使用しないでください。git rev-parse --short HEAD代わりに上記の答え()を使用してください。
jm3 2014年

4
@ jm3は逆です。「磁器」コマンドには、スクリプト用の安定した出力があります。を検索git help showporcelainます。
John Tyree、2015

2
@JohnTyreeこれは混乱を招く問題ですが、jm3は正しかった:磁器のコマンドは解析するためではなく、人間が読めるようにするためのものです。スクリプトで磁器コマンドを使用する必要があり、安定した形式にしたい場合は、それを行うオプション(たとえば、git status、pushおよびblame)がある場合があります。残念ながら、そのオプションはと呼ばれ--porcelainているため、これは混乱を招きます。あなたはで詳細を見つけることができますVonCによって、この偉大な答えを
ファビオが復活モニカ言う

1
私はそれらを見つけたいと...ああ、私は用事それらを見つけるためにgitを使用する必要があるだろう待つ--porcelainそのオプションに名前を付けることにしました親愛なる神
ブリトンKerin

14

おそらくエイリアスが必要なので、気の利いた詳細をすべて覚える必要はありません。以下のいずれかの手順を実行すると、次のように入力できます。

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

承認された回答のフォローアップとして、これを設定する2つの方法を次に示します。

1)グローバル構成を編集してgitに明示的な方法を教えます(私の元の答え):

 # open the git config editor
 $ git config --global --edit
 # in the alias section, add
 ...
 [alias]
   lastcommit = rev-parse HEAD
 ...

2)または、最近Adrienによってコメントされたように、gitにショートカットを教えるショートカットが必要な場合:

$ git config --global alias.lastcommit "rev-parse HEAD"

これ以降、を使用git lastcommitして、最後のコミットのハッシュを表示します。


3
エイドリアン・デ・Sentenacの代わりに、手動でgitの設定ファイルを編集するので、あなたは、単に行うことができますノート:git config --global alias.lastcommit "rev-parse HEAD"
cgmb

12

私はもう少し違うものが必要でした:コミットの完全なsha1を表示しますが、作業ディレクトリがクリーンでない場合は末尾にアスタリスクを追加します。複数のコマンドを使用したくない限り、前の回答のオプションはどれも機能しません。

これが行う1つのライナーです:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
結果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

説明:(注釈付きタグを使用して)現在のコミットを説明しますが、「NOT A TAG」を含むタグのみが含まれます。タグにスペースを含めることはできないため、これはタグに一致せず、結果を表示したいので--always、コマンド--abbrev=0はコミットの完全な()sha1を表示し、作業ディレクトリがの場合はアスタリスクを追加します--dirty

アスタリスクを追加したくない場合、これは前の回答の他のすべてのコマンドと同様に機能します。
git describe --always --abbrev=0 --match "NOT A TAG"
結果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe


おかげで、つまずくだけで、そのための1つまたは他のエコーが
なくなります

1
それは私なしで動作します--match "NOT A TAG"。git 2.18.0および2.7.4でテストされています。この議論が必要な状況はありますか?
トーマス

@Thomas現在のコミットの履歴のどこかに注釈付きのタグがある場合は機能しません。偽のタグは、describeコマンドがコミットを説明するためにタグを使用しないようにします
Rado

8
git show-ref --head --hash head

あなたがスピードを求めているなら、ディースタンが述べたアプローチ

cat .git/refs/heads/<branch-name>

これまでに説明した他のどの方法よりも大幅に高速です。


show-refそれは配管のコマンドなので、スクリプトのための最善の選択肢であるように私には思えるので、保証(あるいは少なくとも可能性が高い)、将来のリリースでは、安定を維持する:他の回答には、使用rev-parseshowdescribe、またはlog、すべての磁器のコマンドです。また、速度が重要でない場合は、show-refマンページの注意事項が適用されます。「このユーティリティの使用は、.gitディレクトリの下のファイルに直接アクセスすることをお勧めします。」
ポン

6

gitファイルからの直接読み取りを使用したBashシェルのワンライナーは次のとおりです。

(head=($(<.git/HEAD)); cat .git/${head[1]})

上記のコマンドをgitルートフォルダーで実行する必要があります。

この方法は、リポジトリファイルがあるが、gitコマンドがインストールされていない場合に役立ちます。

機能しない場合は、.git/refs/headsフォルダにどのような種類のヘッドがあるかを確認してください。


5

ホームディレクトリの「.gitconfig」ファイルに次を追加します

[alias]
sha = rev-parse HEAD

次に、覚えやすいコマンドがあります:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600

3

git bashで$ git log -1を実行するだけです

コマンドに続くこれらの行が表示されます。

commit d25c95d88a5e8b7e15ba6c925a1631a5357095db .. (info about your head)

d25c95d88a5e8b7e15ba6c925a1631a5357095db, is your SHA for last commit.

0

次に、別の直接アクセスの実装を示します。

head="$(cat ".git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(cat ".git/${head#ref: }")"
done

これはhttpでも機能します。これはローカルパッケージアーカイブに役立ちます(公開Webサイトの場合、.gitディレクトリをアクセス可能にすることはお勧めしません)。

head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(curl -s "$baseurl/.git/${head#ref: }")"
done


0
cat .git/HEAD

出力例:

ref: refs/heads/master

それを解析する:

cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"

ウィンドウがある場合は、wsl.exeの使用を検討してください。

wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"

出力:

refs/heads/master

この値は後でgitチェックアウトに使用できますが、SHAを指すようになります。名前で実際の現在のブランチを指すようにするには:

wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"

出力:

master

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.