Git 版本及版本范围表示法
时间:2022-07-23
本文章向大家介绍Git 版本及版本范围表示法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
很多 Git 命令都使用 revision(修订版本)作为参数。根据不同的命令,有时候 revision 参 数代表一个特定的提交,有时候代表某一个提交可以追踪到的所有的父提交(比如 git log)。在 后面的这种情况中,一般也可以提供一个版本范围作为参数。另外,有的命令(例如 git show) 使用 revision 参数代表其他对象,如 blobs 或者 tree 对象。
指定 revision
一个 revision 参数 <rev> 在通常情况下(但并不是所有情况下)代表一个提交对象(commit)。 使用一种称为 扩展 SHA-1(extended SHA-1)的语法。下面是各种各样表示 revision 的语法。
-
<sha1>
, e.g.dae86e1950b1277e545cee180551750029cfe735, dae86e
完整的 SHA-1 ID(40 字节的十六进制字符串),或者一个在仓库中可以唯一代表本次提交的 前导子串都可以指代本次提交。在该例中,由于前导子串dae86e
在仓库中是唯一的,所以可以 使用dae86e
来代表dae86e1950b1277e545cee180551750029cfe735
。如果dae86e
在仓库中不是唯一的,只需要再多加几个字符,使之在仓库中唯一即可。 -
<describeOutput>
, e.g.v1.7.4.2-679-g3bee7fb
git describe 命令的输出:包含一个 tag,后跟一个连字符,一个提交数目,一个连字符, 一个字符 g,最后是一个简写的对象ID。 -
<refname>
, e.g.master, heads/master, refs/heads/master
符号引用。例如:master 通常代表 refs/heads/master 引用指向的提交对象。如果你的仓 库中同时存在 heads/master 和 tags/master,要想代表 master 分支,可以显式指定为: heads/master。如果一个引用名出现了二义性,那么 Git 按照下面的规则处理,使用找到的 第一个匹配。- 如果存在
$GIT_DIR/<refname>
,则使用之 - 否则,查找
refs/<refname>
- 否则,查找
refs/tags/<refname>
- 否则,查找
refs/heads/<refname>
- 否则,查找
refs/remotes/<refname>
- 否则,查找
refs/remotes<refname>/HEAD
- 如果存在
-
@
:一个单独的 @ 代表 HEAD -
<refname>@{<date>}
, e.g.master@{yesterday}, HEAD@{5 minutes ago}
一个引用名,后跟一个 @ 符号,再后面是一个括在大括号里面的日期(例如:{yesterday}, {1 month 2 weeks 3 days 1 hour 1 second ago} 或者 {1979-02-26 18:30:00})代表 该引用在该段时间之前的值。这种用法只能用于引用上面,不能用于一个确切的 commit ID, 并且该引用必须在 $GIT_DIR/logs/ 中存在有 log 记录。注意,这种用法只会查看你 的本地仓库在给定时间点的状态。如果你要查看在某一时间段内的状态,请使用 --since 和 --until 参数。 -
<refname>@{<n>}
, e.g.master@{1}
一个引用名后面跟着一个 @ 后缀,然后是括在大括号中的一个数字,例如({1},{15})。 可以代表该引用之前的第 n 个值。例如,master@{1}
代表 master 之前的值。而master@{5}
则代表 master 之前第 5 次的值。这种用法只能用于引用上,并且该引用 必须具有引用日志($GIT_DIR/logs/<refname>
)。 -
@{<n>}
, e.g.@{1}
如果省略了引用部分,则代表当前分支。例如:如果你当前在分支 blabla 上,那么 @{1} 就和 blabla@{1} 是一个意思。 -
@{-<n>}
, e.g.@{-1}
@{-}, 这种表示法,代表之前第 n 次检出的分支或者提交。 qiandao -
<rev>^
, e.g.HEAD^, v1.5.1^0
在一个 revision 后面加上一个^
后缀可以用来指代 revision 的直接父提交。^<n>
代表第 n 个父提交(例如,<rev>^
和<rev>^1
是等同的)。<rev>^0
代表 rev 自己。当<rev>
是一个 tag 的名字时,<rev>^0
表示该 tag 对象对应的提交 对象。 -
<rev>~<n>
, e.g.master~3
在一个 revision 后面加上一个~<n>
后缀代表 revision 的第 n 个祖先提交。主要用户当 <rev> 有多个父提交的情况。 -
:/<text>
, e.g.:/fix nasty bug
一个冒号,后跟一个斜杠,在后面是一串文本。这串文本会被当做正则表达式对待。整个:/<text>
代表提交信息匹配正则表达式的最近一次提交。正则表达式可匹配提交信息的任何部分。如果要匹配 提交信息的开头,可以使用:/^foo
。 -
<rev>:<path>
, e.g.HEAD:README, :README, master:./README
-
:<n>:<path>
, e.g.:0:README, :README
下面是一个图示,展示了各个概念:
G H I J
/ /
D E F
| /
| / |
|/ |
B C
/
/
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2 = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
指定范围
那些需要遍历历史提交的命令(如 git log)会对一系列的提交进行操作,而不是仅仅针对某一次提交。 对于这些命令来说,如果只给它们提供一个 revision 参数,那么意思是指代沿着该 revision 的父提 交链可以追踪到的所有提交。
如果要排除从某一次提交可以追踪到的提交,只需要在该提交的前面加上前缀 ^
。例如: ^r1 r2
指代从 r2 可以追踪到的所有提交但是不包含从 r1 可以追踪到的所有提交。这种表示 方法非常常见,因此对于 ^r1 r2
来说有一个简写表示法:r1..r2
(注意:r1 与 r2 之间只有 两个英文句点)。可以省略一个 revision,省略的 revision 默认是 HEAD。
相似的表示法:r1...r2
可以叫做 r1 和 r2 之间的差集(数学),就是指代从 r1 可以追踪到的提 交或者是从 r2 可以追踪到的提交,但是不包含从 r1 和 r2 都可以追踪到的。
-
<rev>
:代表从<rev>
可以追踪到的提交(rev 的所有祖先)。 -
^<rev>
:不包含从<rev>
可以追踪到的提交。 -
<rev1>..<rev2>
包含从<rev2>
可以追踪到的所有提交,但是不包含从<rev1>
可以追踪到的提交。 -
<rev1>...<rev2>
包含从<rev1>
或者<rev2>
可以追踪到的提交,但是不包含从两者都可以追踪到的提 交。这和上一种范围表示法容易混淆。上面的是两个点,而这个是三个点。举例说明,在上面 的图示中,D..F 表示的提交范围只有F,而 D…F,表示的提交范围有 D 和 F。 -
<rev>^@
, e.g.HEAD^@
代表<rev>
所有的父提交,也就是从它的父提交可以追踪到的所有提交,但是不包含它 自己。 -
<rev>^!
, e.g.HEAD^!
下面是一些例子:
D G H D
D F G H I J D F
^G D H D
^D B E I J F B
B..C C
B...C G H D E B C
^D B C E I J F B C
C I J F C
C^@ I J F
C^! C
F^! D G H D F
- 【springboot】 springboot 整合mybatis-plus
- jfinal-swagger让你的应用接口更加简单
- 【springboot】 spring session 分布式会话共享
- 基于jfinal Template的Shiro 标签
- 基于Spring Cloud 少量配置完成单点登录开发
- Spring 必知概念(一)
- 如何在EHAB(EntLib)中定义”细粒度”异常策略?
- MVC、MVP以及Model2[下篇]
- Dora.Interception: 一个为.NET Core度身定制的AOP框架
- 为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]
- 关于Expression Tree和IL Emit的所谓的"性能差别"
- 采用一个自创的"验证框架"实现对数据实体的验证[扩展篇]
- 采用一个自创的"验证框架"实现对数据实体的验证[改进篇]
- Flash XSS检测脚本的简单实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入研究RocketMQ消费者是如何获取消息的
- CentOS7下 Apache的安装配置方法
- expect命令在linux下实现批量ssh免密
- 学习Vim合并行的方法和技巧
- 九种查找算法
- 代码防御性编程的十条技巧
- Ubuntu终端多窗口分屏Terminator
- linux 编译安装python3.6的教程详解
- Unix/Linux系统下的nobody用户与nologin详细介绍
- 详解flutter engine 那些没被释放的东西
- Centos7安装PHP及Nginx的教程详解
- Flutter Image实现图片加载
- Centos7系统下搭建.NET Core2.0+Nginx+Supervisor环境
- CentOS7 LNMP+phpmyadmin环境搭建 第二篇LNMP环境搭建教程
- 详解Linux 下开发微信小程序安装开发工具