2319

我想保留(目前)将 Git 变更集链接到存储在 TFS 中的工作项的能力。

我已经编写了一个工具(使用来自 Git 的钩子),我可以在其中将工作项标识符注入到 Git 变更集的消息中。

我还想将 Git 提交的哈希存储在自定义 TFS 工作项字段中。通过这种方式,我可以检查 TFS 中的工作项并查看哪些 Git 变更集与该工作项相关联。

如何轻松地从 Git 的当前提交中检索哈希?

4

22 回答 22

3399

要将任意扩展对象引用转换为 SHA-1,只需使用git-rev-parse,例如

git rev-parse HEAD

或者

git rev-parse --verify HEAD

您也可以像这样检索简短版本

git rev-parse --short HEAD

旁注:如果要将引用分支标签)转换为 SHA-1,则有git show-refgit for-each-ref

于 2009-06-04T09:05:57.627 回答
496

如果您只想要缩短的提交哈希:

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

此外, using%H是另一种获取长提交哈希的方法,-1可以简单地用来代替-n 1.

于 2011-09-30T23:32:09.467 回答
180

另一个,使用 git log:

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

它与@outofculture 的非常相似,虽然有点短。

于 2011-11-21T18:48:18.153 回答
141

要获得完整的 SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

要获得缩短版本:

$ git rev-parse --short HEAD
cbf1b9a
于 2016-07-29T20:04:03.740 回答
78

为了完整起见,因为还没有人建议它。 .git/refs/heads/master是一个只包含一行的文件:最近一次提交的哈希值master。所以你可以从那里阅读它。

或者,作为命令:

cat .git/refs/heads/master

更新:

请注意,git 现在支持将一些头引用存储在 pack-ref 文件中,而不是作为 /refs/heads/ 文件夹中的文件。 https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

于 2012-10-16T11:34:36.190 回答
77

提交哈希

git show -s --format=%H

缩写提交哈希

git show -s --format=%h

-s标志与“抑制差异输出”相同--no-patch并代表“抑制差异输出”。

单击此处获取更多git show示例。

于 2017-03-27T19:33:21.350 回答
59

总是有的git describe。默认情况下,它为您提供-

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
于 2011-08-26T10:43:43.283 回答
35

采用git rev-list --max-count=1 HEAD

于 2009-06-04T08:48:11.670 回答
27

如果您需要在脚本期间将哈希存储在变量中,您可以使用

last_commit=$(git rev-parse HEAD);

或者,如果你只想要前 10 个字符(就像 github.com 一样)

last_commit=$(git rev-parse --short=10 HEAD);
于 2012-07-15T16:04:21.593 回答
20

如果你想要超级hacky的方式来做到这一点:

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

基本上,git 将 HEAD 的位置存储在 .git/HEAD 中,格式为ref: {path from .git}. 该命令将其读出,切掉“ref:”,并读出它指向的任何文件。

当然,这在分离头模式下会失败,因为 HEAD 不会是“ref:...”,而是哈希本身 - 但是你知道,我认为你不希望你的 bash 有那么多聪明才智-衬里。但是,如果您不认为分号作弊...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH
于 2015-10-14T19:15:46.893 回答
17

我需要一些不同的东西:显示提交的完整 sha1,但如果工作目录不干净,则在末尾附加一个星号。除非我想使用多个命令,否则前面的答案中的选项都不起作用。

这是做的一个班轮:
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

于 2018-02-17T19:06:21.003 回答
16

我知道的最简洁的方法:

git show --pretty=%h 

如果您想要哈希的特定位数,您可以添加:

--abbrev=n
于 2014-02-07T06:43:57.520 回答
15

也许您想要一个别名,这样您就不必记住所有漂亮的细节。执行以下步骤之一后,您将能够简单地键入:

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

跟进接受的答案,这里有两种设置方法:

1)通过编辑全局配置(我的原始答案)以明确的方式教git:

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

2)或者,如果您喜欢教 git 捷径的捷径,正如 Adrien 最近评论的那样:

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

从这里开始,用于git lastcommit显示最后一次提交的哈希值。

于 2015-10-09T12:53:46.470 回答
10

git rev-parse HEAD成功了。

如果您需要在保存实际分支(如果有的话)之后将其存储以便结帐,则可能更可取:

cat .git/HEAD

示例输出:

ref: refs/heads/master

解析它:

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

如果您有 Windows,那么您可以考虑使用 wsl.exe:

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

输出:

refs/heads/master

该值可以用于稍后 git checkout,但它会指向其 SHA。要使其通过名称指向实际的当前分支,请执行以下操作:

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

输出:

master
于 2019-11-04T16:12:28.653 回答
9

这是使用直接从 git 文件读取的 Bash shell 中的单行代码:

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

您需要在 git 根文件夹中运行上述命令。

当您有存储库文件但git尚未安装命令时,此方法可能很有用。

如果不起作用,请在.git/refs/heads文件夹中检查你有什么样的头。

于 2017-10-05T22:11:44.043 回答
8
git show-ref --head --hash head

如果你追求速度,Deestan 提到的方法

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

比迄今为止此处列出的任何其他方法都要快得多。

于 2015-04-30T07:06:10.137 回答
6

在文件“.gitconfig”的主目录中添加以下内容

[alias]
sha = rev-parse HEAD

那么您将有一个更容易记住的命令:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
于 2016-02-18T16:16:08.770 回答
5

在 git bash 上,只需运行 $ git log -1

您将看到,这些行遵循您的命令。

commit d25c95d88a5e8b7e15ba6c925a1631a5357095db .. (info about your head)

d25c95d88a5e8b7e15ba6c925a1631a5357095db, is your SHA for last commit.
于 2019-11-26T12:40:46.307 回答
0

这是另一个直接访问实现:

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

这也适用于对本地包存档有用的 http(我知道:对于公共网站,不建议使 .git 目录可访问):

head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(curl -s "$baseurl/.git/${head#ref: }")"
done
于 2016-11-04T13:20:31.623 回答
0

这是另一种方法:)

git log | grep -o '\w\{8,\}' | head -n 1
于 2017-02-10T15:14:12.080 回答
0

主 git repo 和子模块的漂亮打印:

echo "Main GIT repo:"
echo $(git show -s --format=%H) '(main)'
echo "Sub-modules:"
git submodule status | awk '{print $1,$2}'

示例输出:

3a032b0992d7786b00a8822bbcbf192326160cf9 (main)
7de695d58f427c0887b094271ba1ae77a439084f sub-module-1
58f427c0887b01ba1ae77a439084947de695d27f sub-module-2
d58f427c0887de6957b09439084f4271ba1ae77a sub-module-3
于 2022-02-27T08:52:20.770 回答
-1

echo "打印当前分支的最后一次提交 id#:";

 git reflog

显示实际结果的图像

于 2022-02-23T10:53:06.310 回答