Answers:
要将任意扩展对象引用转换为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?
要获得完整的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 IN的任何脚本你可能有。
为了完整起见,因为没有人建议过。 .git/refs/heads/master
是一个仅包含一行的文件:最近提交的哈希值master
。因此,您可以从那里阅读它。
或者,作为命令:
cat .git/refs/heads/master
更新:
注意,git现在支持将一些head refs存储在pack-ref文件中,而不是作为/ refs / heads /文件夹中的文件存储。 https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
master
,则不一定正确。
master
。
.git/HEAD
通常指向一个参考,如果那里有SHA1,则处于分离头模式。
.git
子目录,但不一定如此。请参见手册页中的--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
,即7.2.0.Final标签和当前HEAD的全局SHA-1的前10个摘要为“ 65bf4ef2d4”。这对于版本字符串非常有用。使用--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
如果您想采用超级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
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
跟踪已接受的答案,以下是两种设置方法:
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
显示最后一次提交的哈希值。
git config --global alias.lastcommit "rev-parse HEAD"
我需要一些不同的东西:显示提交的完整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
--match "NOT A TAG"
。在git 2.18.0和2.7.4中进行了测试。在任何情况下都需要此参数吗?
git show-ref --head --hash head
如果您要提高速度,那么Deestan提到的方法
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工作,这对本地软件包归档很有用(我知道:对于公共网站,不建议使.git目录可访问):
head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
head="$(curl -s "$baseurl/.git/${head#ref: }")"
done
这是另一种处理方法:)
git log | grep -o '\w\{8,\}' | head -n 1
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
--verify
暗示:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.