很多 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 按照下面的规则处理,使用找到的 第一个匹配。

    1. 如果存在 $GIT_DIR/<refname>,则使用之
    2. 否则,查找 refs/<refname>
    3. 否则,查找 refs/tags/<refname>
    4. 否则,查找 refs/heads/<refname>
    5. 否则,查找 refs/remotes/<refname>
    6. 否则,查找 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

 

Git 版本及版本范围表示法的更多相关文章

  1. 【Git学习笔记】初始化Git仓库和版本回退

    学习地址 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 什么是版本库呢?版本库又 ...

  2. GIT(分布式版本控制系统)

    Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.[1] Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本 ...

  3. git和其他版本控制系统的区别

    所有除了Git以外的版本控制系统都使用增量存储方式来保存不同版本,而Git则在每一个commit时,保存一个整个文件的content copy,除非那个文件没有做过改动.Git和其他版本系统的主要区别 ...

  4. 学习笔记--Git安装 创建版本库 图文详解

    一.Git下载 在Windows上安装git,一般为msysgit,官网地址:http://git-scm.com/ 我下载的是Git-1.9.2-preview20140411.exe 二.Git安 ...

  5. Git教程--Git安装和版本库的创建

    Git的诞生 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大是靠全世界热 ...

  6. Git学习之路(2)-安装GIt和创建版本库

    ▓▓▓▓▓▓ 大致介绍 前面一片博客介绍了Git到底是什么东西,如果有不明白的可以移步 Git学习之路(1)-Git简介 ,这篇博客主要讲解在Windows上安装Git和创建一个版本库 ▓▓▓▓▓▓ ...

  7. Git入门——本地版本库操作

    作为一个一直用SVN的家伙,深深地感到了自己在版本控制工具上的落伍.... 首先必须强调的是: Git与Github不是一回事. Git是目前世界上最先进的分布式版本控制系统,于2005年被linux ...

  8. [git]入门-创建版本库

    转载整理自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256 ...

  9. git入门 创建版本库, 版本管理 分支 标签

    参考: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 GIT最流行的分布式版本 ...

  10. git获取一个版本相对于另一个版本新增,修改,删除的文件

    git diff --name-status 00ef237ef0f0a4b8bd9609c2b6d570472028212d abf13b4d58abbb05a7d494cdc205d025978a ...

随机推荐

  1. Linux 用libevent实现的简单http服务器

    Linux 用libevent实现的简单http服务器 main.c #include <stdio.h> #include <sys/types.h> #include &l ...

  2. 上云测试,这些关键点你get 到没有

    导读,先从云化说起,再谈谈云化形态下,除了常规的功能测试,云化的测试,还需要有几个必须要get到的硬核指标,最后在分别详解这些关键点硬核指标是什么,和如何测试呢.这是个值得深思的问题,希望所有测试人都 ...

  3. 抓包工具:tcpdump抓包命令详解

    抓包工具:tcpdump抓包命令详解 简介: tcpdump全称:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以 ...

  4. USACO Grass Planting

    洛谷 P3038 [USACO11DEC]牧草种植Grass Planting 洛谷传送门 JDOJ 2282: USACO 2011 Dec Gold 3.Grass Planting JDOJ传送 ...

  5. 实现一个new操作符

    new 操作符做了这些事: 1.它创建了一个全新的对象: 2.它会被执行[[Prototype]](也就是__proto__)链接: 3.它使this指向新创建的对象: 4.通过new创建的每个对象最 ...

  6. pinpoint 安装指南

    tangcheng@ChenTang MINGW64 /c/Developer $ git clone https://github.com/naver/pinpoint.git Cloning in ...

  7. 微信小程序入门笔记

    目录的作用: 1. pages目录: 该目录下存放所有的定义页面 2. utils目录: 该目录下存放定义的一些小功能组件 3. 根目录下app.js文件: 定义小程序对象, 执行小程序生命周期内的各 ...

  8. P3273 【[SCOI2011]棘手的操作】

    此题用可并堆勉强过,需加输入优化,但是这里有个问题就是set总是过不了一组数据,用multiset时间有点高,不懂这个问题,请懂此问题的给我留言. 左偏树+并查集 下面上代码: #include &l ...

  9. Spring 常用配置、Bean

    spring模块 Spring-Core: Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能. Spring-Context:(Spring ...

  10. [******] java多线程连续打印abc

    题目描述 建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 5种方法 使 ...