## 7.1 选择修订版本
Git 允许你通过几种方法来指明特定的或者一定范围内的提交。
### 7.1.1 单个修订版本
**简短的 SHA-1**
提供 `SHA-1` 的前几个字符就可以获得对应的那次提交,当然所提供的 `SHA-1` 字符数量不得少于 4 个,并且没有歧义。
Git 可以为 SHA-1 值生成出简短且唯一的缩写。 如果你在`git log` 后加上`--abbrev-commit` 参数,输出结果里就会显示简短且唯一的值;默认使用七个字符,不过有时为了避免 SHA-1 的歧义,会增加字符数:
```bash
$ git log --abbrev-commit --pretty=oneline
```
**分支引用**
指明一次提交最直接的方法是有一个指向它的分支引用。如果想知道某个分支指向哪个特定的 `SHA-1`,或者想看任何一个例子中被简写的 `SHA-1` ,可以使用 `rev-parse` :
```
$ git rev-parse <branch>
```
**引用日志**
Git 会在后台保存一个引用日志(reflog),引用日志记录了最近几个月 `HEAD` 和分支引用所指向的历史。
```
$ git reflog
```
值得注意的是,引用日志只存在于本地仓库,一个记录在自己的仓库里做过什么的日志。 其他人拷贝的仓库里的引用日志不会和你的相同;而你新克隆一个仓库的时候,引用日志是空的,因为你在仓库里还没有操作。
**祖先引用**
祖先引用是另一种指明一个提交的方式。 如果你在引用的尾部加上一个`^`, Git 会将其解析为该引用的上一个提交。可以使用`HEAD^`来查看上一个提交,也就是 “HEAD 的父提交”:
```
$ git show HEAD^
```
另一种指明祖先提交的方法是`~`。 同样是指向第一父提交,因此`HEAD~`和`HEAD^`是等价的。 而区别在于你在后面加数字的时候,`HEAD~2`代表 “第一父提交的第一父提交”,也就是 “祖父提交”。
### 7.1.2 提交区间
**双点**
最常用的指明提交区间语法是双点。 这种语法可以让 Git 选出在一个分支中而不在另一个分支中的提交。例如有以下的提交历史:

想要查看 experiment 分支中还有哪些提交尚未被合并入 master 分支。 你可以使用`master..experiment`来让 Git 显示这些提交。
```
$ git log master..experiment
```
**多点**
需要两个以上的分支才能确定所需要的修订,比如查看哪些提交是被包含在某些分支中的一个,但是不在当前的分支上。例如,查看所有被`refA`或`refB`包含的但是不被`refC`包含的提交,你可以输入下面中的任意一个命令:
```
$ git log refA refB ^refC
$ git log refA refB --not refC
```
**三点**
选择出被两个引用中的一个包含但又不被两者同时包含的提交。
```
$ git log master...experiment
```
`log`命令的一个常用参数是`--left-right`,它会显示每个提交到底处于哪一侧的分支:
```
$ git log --left-right master...experiment
```
- 介绍
- 第一章 起步
- 1.1 关于版本控制
- 1.2 Git 简史
- 1.3 Git 基础
- 1.4 命令行
- 1.5 安装 Git
- 1.6 初次运行 Git 前的配置
- 1.7 获得帮助
- 第二章 基础
- 2.1 获取仓库
- 2.2 记录每次更新到仓库
- 2.3 查看提交历史
- 2.4 撤销操作
- 2.5 远程仓库的使用
- 2.6 打标签
- 2.7 Git 别名
- 第三章 分支
- 3.1 分支简介
- 3.2 分支的新建与合并
- 3.3 分支管理
- 3.4 分支开发工作流
- 3.5 远程分支
- 3.6 变基
- 第四章 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上搭建 Git
- 4.3 生成 SSH 公钥
- 4.4 配置服务器
- 4.5 Git 守护进程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的选择
- 第五章 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一个项目贡献
- 5.3 维护项目
- 第六章 GitHub
- 6.1 账户的创建和配置
- 6.2 对项目做出贡献
- 6.3 维护项目
- 6.4 管理组织
- 6.5 脚本 GitHub
- 第七章 Git 工具
- 7.1 选择修订版本
- 7.2 交互式暂存
- 7.3 储藏与清理
- 7.4 签署工作
- 7.5 搜索
- 7.6 重写历史
- 7.7 重置揭密
- 7.8 高级合并
- 7.9 Rerere
- 7.10 使用Git调试
- 7.11 子模板
- 7.12 打包
- 7.13 替换
- 7.14 凭证存储
- 第八章 自定义 Git
- 8.1 配置 Git
- 8.2 Git 属性
- 8.3 Git 钩子
- 8.4 使用强制策略的一个例子
- 第九章 Git 与其他系统
- 9.1 作为客户端的 Git
- 9.2 迁移到 Git
- 第十章 Git 内部原理
- 10.1 底层命令和高层命令
- 10.2 Git 对象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用规格
- 10.6 传输协议
- 10.7 维护与数据恢复
- 10.8 环境变量
