本文精选介绍了Git 2.40.0以后版本中的六项实用功能更新。文章详细解析了reftable新存储格式如何高效处理大量引用;SHA-1与SHA-256算法的兼容措施;git diff显示格式的自定义配置;commit信息注释格式的个性化设置;配置时添加注释的新功能;以及git revert命令输出信息的改进。每个特性都配有实际命令示例和使用场景分析,帮助开发者利用这些新功能提升Git使用体验和工作效率。
1. reftable 的初步支持
传统的 git 仓库,本地或远程分支以及 tag 的信息都记录在 .git/refs/heads/、.git/refs/remotes/、.git/refs/tags/ 目录下,里面每个文件包含它们指向的对象的 sha 值,它们就叫做引用(reference)。当我们的 git 仓库存在大量分支或 tag 时,意味着仓库里包含大量引用,如果引用被打包成一个单一的大的引用包(.packed_refs)就变得难以维护(如在更新或重写时会消耗很多 IO);同时,如果有大量未被打包的 “松散引用” 也会导致磁盘负担(如查询变慢,或者占用磁盘 inode),这是传统的 git 引用的存储方式的弊端。现在(2.45.0 开始) git 引入了新的引用存储格式,即 reftable。reftable 原是为 Gerrit 项目设计的一种二进制存储引用的方式,具备常数时间的引用查询、常数时间的引用对象校验、节省存储空间等优点。
如何在 git 仓库中使用该特性:
1 |
|
2. SHA-1, SHA-256 的初步相互兼容支持
注:目前还是实验性质,如果本地仓库是使用 SHA-256 算法,是无法推送到远程仓库的。
我们知道 git 仓库一直是使用 sha1 算法对 git 仓库中的各种对象,包括 commit, tag, tree, blob 等计算其 hash 值来标识它们的。但是由于 sha-1 不再绝对安全,所以 git 社区也在考虑使用更安全的 sha256 算法。目前(2.45.0 开始)已实现初步的功能.
1 | 在初始化一个新仓库时, 使用 --object-format 指定 |
3. git diff 显示格式的设置
在使用 git diff 或 git show 查看文件的修改差异时,在新旧文件名前的前缀都是 a/、b/,如:
1 | $ git diff HEAD^ -- GIT-VERSION-GEN |
现在(2.45.0 开始)可以修改这个前缀,比如修改为:before/, after/, 更有用的方式是修改为:./,这样就成了一个有效的文件链接,可以直接点击跳转。
1 | $ git config diff.srcPrefix "./" |
1 | $ git diff HEAD^ -- GIT-VERSION-GEN |
4. 更改编写 commit 信息时的注释格式
我们知道使用 git add 添加文件之后再直接执行 git commit 命令会进入交互式界面,提示我们编写 commit message, 默认显示如下:
1 | Please enter the commit message for your changes. Lines starting |
根据上面的提示信息,以单字节 "#" 开头的都是注释信息将会被忽略。而最新版本的 git (2.45.0 开始)可以定制化这个注释的格式,设置多字节的字符,配置方式如下:
1 | $ git config core.commentString "//" |
注:在我的 Windows 上, 这里设置的
"//"会变为"/", 所以要想双斜线,需要配置为"///",还没在其他环境中验证,不知道是不是 bug。
这样配置好处是可以使用自己喜欢的注释方式,更实用的是,当不使用 "#" 作为注释符时,可以直接在 commit message 开头使用 #1234 这类特殊的标识方式,它可以代表 issue 号或者 PR 号,是不是更方便了。
5. 修改配置时,进行注释
有时候我们配置了很多配置项,但是忘了加注释,这会妨碍阅读。 虽然在之后可以手动修改 gitconfig 文件,但是仍不够方便。现在(2.45.0 开始)可以在修改配置同时追加注释。
1 | $ git config --comment 'to show the merge base' merge.conflictStyle diff3 |
6. git revert 的修改信息改进
在 git-2.43.0 之前,对同一个提交多次进行 git revert 的效果如下:
1 |
|
以上是进行了三次 revert 的效果。从 git-2.43.0 开始,同样的操作之后,效果如下:
1 | $ git log --oneline |
可读性更好了。
以上是从 git-2.40.0 以来发布的 git 版本中发现的一些有用和有趣的更新。当然,截止到当前的 2.45.2,这期间还有很多的性能优化以及安全漏洞问题更新并没有在这里涉及,感兴趣的话可以去 官方博客 查看。