回答:
任意の拡張オブジェクト参照をSHA-1に変換するには、単にgit-rev-parseを使用します。次に例を示します。
git rev-parse HEAD
または
git rev-parse --verify HEAD
追記:あなたがオンにする場合の参照(枝やタグを SHA-1に)、そこにあるgit show-refとgit for-each-ref。
git rev-parse --short HEAD誰かが疑問に思っている場合に備えて、ハッシュの短いバージョンを返します。
--shortよう、--short=12ハッシュからの数字の特定の番号を取得するには、。
--short=Nについてです最小限の桁数。短い方が他のコミットの短縮と区別がつかない場合、gitはより多くの桁を使用します。例:git rev-parse --short=2 HEADまたはを試してくださいgit log --oneline --abbrev=2。
git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
短縮されたハッシュのみが必要な場合:
git log --pretty=format:'%h' -n 1
さらに、%Hを使用することは、長いハッシュを取得する別の方法です。
git log磁器だと思いますgit rev-parse。
git checkout 33aa44; git log -n 1くれ33aa44ます。使用しているgitのバージョンは何ですか?
もう1つは、git logを使用します。
git log -1 --format="%H"
@outofcultureのそれに非常に似ていますが、少し短いです。
HEAD。
HEADこれまでのポイントは、などという名前BRANCHEのノウハウではなく、コミット切り離さヘッド。
完全なSHAを取得するには:
$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537
短縮バージョンを取得するには:
$ git rev-parse --short HEAD
cbf1b9a
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任意のスクリプトのためにあなたが持つかもしれないが。
完全を期すため、まだ誰も提案していないため。 .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
masterであることを前提としていますが、必ずしもそうではありません。
master。
.git/HEAD通常はrefを指し、そこにSHA1がある場合は、分離ヘッドモードになります。
.gitサブディレクトリがあることを前提としているため、必ずしもそうとは限りません。manページの--separate-git-dirフラグを参照してgit initください。
常にありgit describeます。デフォルトでは次のようになります-
john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
git describe --long --dirty --abbrev=10 --tagsになるようなものが好き7.2.0.Final-447-g65bf4ef2d4です。これはバージョン文字列に非常に適しています。--longを使用すると、タグが完全に一致した場合でも、常にカウント(-0-)とハッシュが追加されます。
git describe --always「一意に省略されたコミットオブジェクトをフォールバックとして表示する」
git describe --tags --first-parent --abbrev=11 --long --dirty --always。この--alwaysオプションは、タグがない場合でも結果(ハッシュ)を提供することを意味します。--first-parent手段は、マージコミットで混乱とだけ現在のブランチ上の項目を次のされません。また、現在のブランチにコミットされていない変更がある場合は、結果に--dirty追加-dirtyされます。
使用する git rev-list --max-count=1 HEAD
超ハッキーな方法でそれをしたい場合:
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
sh。ハーフ以降のドキュメントコメントの時間、そしてここでの要点です:gist.github.com/Fordi/29b8d6d1ef1662b306bfc2bd99151b07
私が知っている最も簡潔な方法:
git show --pretty=%h
ハッシュの特定の桁数が必要な場合は、次を追加できます。
--abbrev=n
git showが、磁器コマンド(つまり、ユーザー向け)と呼ばれるものであり、出力は変更される可能性があるため、スクリプトでは使用しないでください。git rev-parse --short HEAD代わりに上記の答え()を使用してください。
git help showしporcelainます。
--porcelainているため、これは混乱を招きます。あなたはで詳細を見つけることができますVonCによって、この偉大な答えを
おそらくエイリアスが必要なので、気の利いた詳細をすべて覚える必要はありません。以下のいずれかの手順を実行すると、次のように入力できます。
$ 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して、最後のコミットのハッシュを表示します。
git config --global alias.lastcommit "rev-parse HEAD"
私はもう少し違うものが必要でした:コミットの完全な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
--match "NOT A TAG"。git 2.18.0および2.7.4でテストされています。この議論が必要な状況はありますか?
git show-ref --head --hash head
あなたがスピードを求めているなら、ディースタンが述べたアプローチ
cat .git/refs/heads/<branch-name>
これまでに説明した他のどの方法よりも大幅に高速です。
show-refそれは配管のコマンドなので、スクリプトのための最善の選択肢であるように私には思えるので、保証(あるいは少なくとも可能性が高い)、将来のリリースでは、安定を維持する:他の回答には、使用rev-parse、show、describe、またはlog、すべての磁器のコマンドです。また、速度が重要でない場合は、show-refマンページの注意事項が適用されます。「このユーティリティの使用は、.gitディレクトリの下のファイルに直接アクセスすることをお勧めします。」
次に、別の直接アクセスの実装を示します。
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
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
--verifyそれは意味:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.