如何在Git中获取当前提交的哈希值?

如何在Git中获取当前提交的哈希值?

1314875 次浏览

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

要将任何扩展对象引用转换为哈希,请使用#0

git rev-parse HEAD

git rev-parse --verify HEAD

要检索短哈希:

git rev-parse --short HEAD

要将参考文献(例如分支和标签)转换为哈希,请使用git show-refgit for-each-ref

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

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

要获取缩短的提交哈希,请使用%h格式说明符:

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

%H表示长提交哈希。此外,-1可以直接代替-n 1

另一个,使用git log:

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

它与@outof文化非常相似,尽管有点短。

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

last_commit=$(git rev-parse HEAD);

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

last_commit=$(git rev-parse --short=10 HEAD);

为了完整性,因为还没有人建议它。.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

我所知道的最简洁的方式:

git show --pretty=%h

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

--abbrev=n
git show-ref --head --hash head

如果你想要速度,Deestan提到的方法

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

它比迄今为止列出的任何其他方法都要快。

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

$ git lastcommit49c03fc679ab11534e1b4b35687b1225c365c630

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

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来显示最后一次提交的哈希值。

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

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

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

当然,这在分离头模式下会失败,因为HEAD不会是“ref:…”,而是哈希本身——但是你知道,我认为你不希望你的bash单行程序有那么多聪明。

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

在您的home-dir文件“. gitconfig”中添加以下内容

[alias]sha = rev-parse HEAD

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

$ git sha59fbfdbadb43ad0b6154c982c997041e9e53b600

要获得完整的SHA:

$ git rev-parse HEADcbf1b9a1be984a9f61b79a05f23b19f66d533537

要获得缩短版本:

$ git rev-parse --short HEADcbf1b9a

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

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

这也适用于超文本传输协议,这对本地包存档很有用(我知道:对于公共网站,不建议访问. git目录):

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

这是另一种方法:)

git log | grep -o '\w\{8,\}' | head -n 1

提交哈希

git show -s --format=%H

简写提交哈希

git show -s --format=%h

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

点击这里查看更多git show示例。

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

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

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

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

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

我需要一些不同的东西:显示提交的完整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

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签出,但它会指向其SHA。要使其通过名称指向实际的当前分支,请执行:

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

输出:

master

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

你会看到,这些线遵循你的命令。

commit d25c95d88a5e8b7e15ba6c925a1631a5357095db .. (info about your head)
d25c95d88a5e8b7e15ba6c925a1631a5357095db, is your SHA for last commit.

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

 git reflog

显示当前结果的图像

漂亮的主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-158f427c0887b01ba1ae77a439084947de695d27f sub-module-2d58f427c0887de6957b09439084f4271ba1ae77a sub-module-3

我如何在python中做到这一点(基于@kenorb的bash答案)

def get_git_sha():# Which branch are we on?branch = open(".git/HEAD", "r").read()
# Parse output "ref: refs/heads/my_branch" -> my_branchbranch = branch.strip().split("/")[-1]
# What's the latest commit in this branch?return open(f".git/refs/heads/{branch}").read().strip()