关山难越,谁悲失路之人;萍水相逢,尽是他乡之客。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程教程 > 技术文章 > 正文

大白话 git 教程-04-历史日志的细节

guanshanw 2023-09-30 13:29 14 浏览 0 评论

开始之前为了方便说明,先安装有个小工具,它是 git 的反写,叫 tig,是一个字符界面的 git 日志工具。可以使用包管理器安装,也可以使用源代码编译安装,地址是 https://github.com/jonas/tig/blob/master/INSTALL.adoc。

安装完成后,在 git 仓库下输入 tig 命令,会显示提交的历史记录,通过方向键或者 vim 的 hjkl 键可以查看每个历史的信息,回车后显示提交的详细信息,q 键退出回到上一层。

首先是提交的指纹 d5d999f34327261749b891acbf06ac9339f90251,这个指纹码是一个 40 位 16 进制数,它是通过 SHA-1 算法得到,全称是 Secure Hash Algorithm 1,意思是安全散列算法1,这种算法是一个单向的函数,根据输出结果不能得到输入内容,但是只要输入内容有一丝一毫的变化,输出结果会不同(后来被证明可能发生碰撞,不过用来做指纹区分没有什么问题)。

在前面章节 git log 加上美化参数,把指纹的显示长度做了缩短,只取了前面的 7 位,因为前面 7 位就可以在仓库中作为唯一的指纹了,使用 git 命令的时就也不用全部输入指纹码。

在命令行中输入 git show 5d999f 和 git show d5d999f34327261749b891acbf06ac9339f90251,是相同的显示结果,多输入几位指纹码也可以,在目前的仓库状态下,输入 git show d5d9 都可以显示,不带指纹码只输入 git show 会显示最后一次提交的信息。

前面提到过 HEAD 就是版本库最后一次的提交,可以通过下面的命令看看 HEAD 的文件构成:

wangbo@wangbo-VirtualBox:~/test/git-demo$ git cat-file commit HEAD
tree 3ecf800bdea3b30b1c7eaf76ef17c9a3d9f09c27
parent bba42353ad195470c311dd27a26248ae0ab5c006
author wangbo <wangbo@develop-developer.com> 1608521565 +0800
committer wangbo <wangbo@develop-developer.com> 1608521565 +0800

ignore tmp

这个 HEAD 的信息包含了文件树 tree 指纹、上一次的指纹 parent、以及提交作者信息,再加上 commit 的文本信息的字符数:

wangbo@wangbo-VirtualBox:~/test/git-demo$ printf "commit %s\0" $(git cat-file commit HEAD | wc -c)
commit 233

合并通过 SHA-1 算法就得到了提交的指纹码,用如下命令验证一下,发现和 git 的提交历史的指纹码相同:

(printf "commit %s\0" $(git cat-file commit HEAD | wc -c); git cat-file commit HEAD) | shasum

其中用到的 tree 指纹就是文件的内容,用 git cat-file -p 查看一下:

wangbo@wangbo-VirtualBox:~/test/git-demo$ git cat-file -p 3ecf800bdea3b30b1c7eaf76ef17c9a3d9f09c27
100644 blob 5c9a1f4e0f09d3e74ad8ac4c957364f52763bc81  .gitignore
100644 blob ce013625030ba8dba906f756967f9e9ca394464a  hello.txt
100644 blob be147a1ee013b8a6288fdd64ad748db29ed4ce41  readme.md 

原来指纹码就是 git 把文件树的内容、作者信息、提交的信息、上一次提交的指纹码等综合在一起来算出来的,只要有其中一项不同,它的指纹码就不可能相同了。

关于指纹码的知识就到这里,大致了解怎么计算的即可,当需要使用指纹码的时候,通常使用前面 7 位就 OK 了。

相关推荐

七条简单命令让您玩转Git
七条简单命令让您玩转Git

凭借着出色的协作能力、快速部署效果与代码构建辅助作用,Git已经得到越来越多企业用户的青睐。除了用于开发商业及消费级应用之外,众多科学及政府机构也开始尝试使用这...

2023-10-07 12:14 guanshanw

基本完整的关于Git分支branch的操作
基本完整的关于Git分支branch的操作

Git使用背景项目中要用到dev或者其他分支开发完代码,需要将该分支合并到master的需求操作步骤下面以dev名称为lex为分支名为例来操作一遍客户端操作:...

2023-10-07 12:14 guanshanw

Git 进阶(合并与变基)
Git 进阶(合并与变基)

在Git中整合来自不同分支的修改主要有两种方法:合并(merge)以及变基(rebase)合并(merge)merge流程图merge的原理是找到这两个分...

2023-10-07 12:13 guanshanw

Git学习笔记 003 Git进阶功能 part5 合并(第一部分)

合并(merge)是很常用的操作。尤其是一个庞大的很多人参与开发的企业级应用。一般会设定一个主分支,和多个副分支。在副分支开发完成后,合并到主分支中。始终保持主分支是一个完整的,稳定的最新状态的分支。...

非标题党,三张图帮你理解git merge和git rebase的区别
非标题党,三张图帮你理解git merge和git rebase的区别

初始场景:基于正常的开发分支修改几个小bug,然后在合并到开发分支上。gitmergegitcheckoutfeaturegitmergeho...

2023-10-07 12:13 guanshanw

git 初次使用(01)
git 初次使用(01)

先从github上克隆代码下来:使用vscode克隆代码如下图,填写上github仓库地址:vscode有时候克隆代码速度比较慢,可以用命令行方式克隆gitc...

2023-10-07 12:12 guanshanw

Git 远程操作

4.Git远程操作命令说明gitremote远程版本库操作gitfetch从远程获取版本库gitpull下载远程代码并合并gitpush上传远程代码并合并4.1远程版本库操作gitre...

Git常用命令-总结
Git常用命令-总结

创建git用户$gitconfig--globaluser.name"YourName"$gitconfig--globaluser.em...

2023-10-07 12:12 guanshanw

git中删除从别人clone下来项目的git信息,并修改为自己的分支

如果你从别人的Git存储库中克隆了一个项目,并想要删除与该存储库相关的Git信息,并将其修改为你自己的分支,则可以执行以下步骤:使用gitclone命令克隆存储库:gitclone<u...

git系列-回滚和放弃本地修改

回滚历史提交就是reset的功能。这种情况是已经提交远程仓库,需要回滚到之前的提交。gitreset--hardcommitId//注:强制提交后,当前版本后面的提交版本将会删掉!gi...

GIT使用小技巧大全
GIT使用小技巧大全

在大型软件工程的开发过程中,版本控制是无法绕过去的;目前来说,最火的版本控制软件就是GIT了。早两年SVN比较火,不过被大神linus喷了几次后,就日落西山了,...

2023-10-07 12:11 guanshanw

git相关命令-上
git相关命令-上

这些命令都是看了文档后,个人觉得比较有用的一些,展示给大家。回到远程仓库的状态抛弃本地所有的修改,回到远程仓库的状态。gitfetch--all&...

2023-10-07 12:10 guanshanw

Git命令行接口:掌握Git的必备技能
Git命令行接口:掌握Git的必备技能

Git是一款强大的分布式版本控制工具,它支持命令行界面操作。熟练掌握Git命令行接口,是开发者使用Git的必备技能之一。在这篇文章中,我们将介绍Git命令行接口...

2023-10-07 12:10 guanshanw

Git命令详解
Git命令详解

相信各位小伙伴们应该都对git有一些了解,毕竟作为代码管理的神器,就算不是IT行业的小伙伴肯定也或多或少的听说过一些。今天就来和小伙伴们分享一下自己总结的常用命...

2023-10-07 12:10 guanshanw

工作7年收集到的git命令
工作7年收集到的git命令

概念git中的术语解释:仓库也叫版本库(repository)stage:暂存区,add后会存到暂存区,commit后提交到版本库git安装linux...

2023-10-07 12:10 guanshanw

取消回复欢迎 发表评论: