如何获取Git中当前提交的哈希值
wptr33 2025-05-26 19:22 46 浏览
技术背景
在使用Git进行版本控制时,每个提交都有一个唯一的哈希值,它可以用于标识特定的提交,方便回退、对比和引用等操作。了解如何获取当前提交的哈希值是Git使用中的一个基础技能。
实现步骤
使用 git rev-parse
- 获取完整哈希值:
 
git rev-parse HEAD- 获取短哈希值:
 
git rev-parse --short HEAD- 验证并获取哈希值:
 
git rev-parse --verify HEAD使用 git log
- 获取长哈希值:
 
git log -1 --format=%H- 获取短哈希值:
 
git log --pretty=format:'%h' -n 1使用 git show
- 获取完整哈希值:
 
git show -s --format=%H- 获取短哈希值:
 
git show -s --format=%h-s 标志等同于 --no-patch,表示不显示差异输出。
直接读取文件
.git/refs/heads/master 文件包含 master 分支上最新提交的哈希值,可以直接读取:
cat .git/refs/heads/master但要注意,Git现在支持将一些头引用存储在 pack-ref 文件中,而不是 /refs/heads/ 文件夹中的文件。
使用 git describe
默认情况下,git describe 会给出 <最近的标签>-<额外提交数>-<当前提交的哈希值> 的格式:
git describe --always存储哈希值到变量
在脚本中,可以将哈希值存储到变量中:
last_commit=$(git rev-parse HEAD);如果只需要前10个字符:
last_commit=$(git rev-parse --short=10 HEAD);自定义别名
可以为获取哈希值的命令设置别名,方便使用:
git config --global alias.lastcommit "rev-parse HEAD"之后可以使用 git lastcommit 来显示最后一次提交的哈希值。
检查状态并获取哈希值
可以结合 git status 检查工作目录是否干净,并在哈希值后添加 -dirty 标记:
test -z "$(git status --porcelain)" \
    && echo "$(git rev-parse --short HEAD)" \
    || echo "$(git rev-parse --short HEAD)-dirty"核心代码
Bash脚本示例
#!/usr/bin/env bash
RETURN_CODE_SUCCESS=0
RETURN_CODE_ERROR=1
# 检查git状态是干净还是脏
git_get_status() {
    if [ -z "$(git status --porcelain)" ]; then
        echo "clean"
    else
        echo "dirty"
    fi
}
# 获取短提交哈希值,并检查git状态
git_get_short_hash() {
    is_git_repo="$(git rev-parse --is-inside-work-tree)"
    if [ "$is_git_repo" != "true" ]; then
        echo "(not a git repo)"
        return $RETURN_CODE_SUCCESS
    fi
    git_commit_hash="$(git rev-parse --short HEAD)"
    if [ "$(git_get_status)" = "clean" ]; then
        echo "${git_commit_hash}"
    else
        echo "${git_commit_hash}-dirty"
    fi
}
print_status_if_dirty() {
    if [ "$(git_get_status)" = "dirty" ]; then
        echo ""
        echo "WARNING: Your git status is dirty! You have uncommitted changes:"
        echo ""
        echo "=== git status ==="
        git status
        echo ""
        echo "=== git diff ==="
        git diff
        echo ""
    fi
}
main() {
    git_get_short_hash
    print_status_if_dirty
}
if [ "${BASH_SOURCE[0]}" = "$0" ]; then
    __name__="__main__"
else
    __name__="__source__"
fi
if [ "$__name__" = "__main__" ]; then
    main "$@"
fiPython示例
import git_get_short_hash
import textwrap
# 别名函数以缩短名称
git_get_short_hash = git_get_short_hash.git_get_short_hash3
git_short_hash = git_get_short_hash()
program_info_str = textwrap.dedent(f"""
    My other program details here...
    Program version: {git_short_hash}
""")
print(program_info_str)
mylogfile.write(program_info_str)最佳实践
- 对于日常使用,建议使用 git rev-parse HEAD 或 git rev-parse --short HEAD 来获取哈希值,因为它们简洁且高效。
 - 如果需要在脚本中动态获取哈希值并根据状态进行处理,可以使用上述的 git_get_short_hash 函数。
 - 为常用命令设置别名可以提高工作效率,例如 git sha。
 
常见问题
- 文件读取方法失效:直接读取 .git/refs/heads 文件夹中的文件可能会失败,因为Git现在支持将一些头引用存储在 pack-ref 文件中。
 - 分离头指针模式:在分离头指针模式下,一些基于引用的方法可能会失败,因为 HEAD 不再指向引用,而是直接指向哈希值。
 - 性能问题:如果对性能有较高要求,cat .git/refs/heads/<分支名> 比其他方法要快得多。
 
- 上一篇:日常开发中常用的git操作命令和使用技巧
 - 下一篇:手把手带你入门github
 
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
 - 
                        
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
 
- 继续学习Python中的while true/break语句
 - 
                        
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
 
- python continue和break的区别_python中break语句和continue语句的区别
 - 
                        
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
 
- 简单学Python——关键字6——break和continue
 - 
                        
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
 
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
 - 
                        
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
 
- Python 中 break 和 continue 傻傻分不清
 - 
                        
大家好啊,我是大田。...
 
- python中的流程控制语句:continue、break 和 return使用方法
 - 
                        
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
 
- L017:continue和break - 教程文案
 - 
                        
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
 
- 作为前端开发者,你都经历过怎样的面试?
 - 
                        
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
 
- 面试被问 const 是否不可变?这样回答才显功底
 - 
                        
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
 
- 2023金九银十必看前端面试题!2w字精品!
 - 
                        
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
 
- 前端面试总结_前端面试题整理
 - 
                        
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
 
- 由浅入深,66条JavaScript面试知识点(七)
 - 
                        
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
 
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
 - 
                        
添加图片注释,不超过140字(可选)...
 
- 今年最常见的前端面试题,你会做几道?
 - 
                        
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
 
- 一周热门
 
- 最近发表
 - 
- oracle数据导入导出_oracle数据导入导出工具
 - 继续学习Python中的while true/break语句
 - python continue和break的区别_python中break语句和continue语句的区别
 - 简单学Python——关键字6——break和continue
 - 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
 - Python 中 break 和 continue 傻傻分不清
 - python中的流程控制语句:continue、break 和 return使用方法
 - L017:continue和break - 教程文案
 - 作为前端开发者,你都经历过怎样的面试?
 - 面试被问 const 是否不可变?这样回答才显功底
 
 
- 标签列表
 - 
- git pull (33)
 - git fetch (35)
 - mysql insert (35)
 - mysql distinct (37)
 - concat_ws (36)
 - java continue (36)
 - jenkins官网 (37)
 - mysql 子查询 (37)
 - python元组 (33)
 - mybatis 分页 (35)
 - vba split (37)
 - redis watch (34)
 - python list sort (37)
 - nvarchar2 (34)
 - mysql not null (36)
 - hmset (35)
 - python telnet (35)
 - python readlines() 方法 (36)
 - munmap (35)
 - docker network create (35)
 - redis 集合 (37)
 - python sftp (37)
 - setpriority (34)
 - c语言 switch (34)
 - git commit (34)
 
 
