返回首页 Git Community Book 中文版

介绍

第一步

基本用法

中级技能

高级技能

原理解析

Git 树名

不用 40 个字节长的 SHA 串来表示一个提交(commit)或是其它 Git 对象,有很多种名字表示方法。在 Git 里,这些名字就叫‘树名’(treeish)。

译者注:我目前没有想到更好的中文名字,就先叫‘树名’。

 Sha 短名

如果你的一个提交(commit)的 sha 名字是‘980e3ccdaac54a0d4de358f3fe5d718027d96aae’, Git 会把下面的串视为等价的:

980e3ccdaac54a0d4de358f3fe5d718027d96aae
980e3ccdaac54a0d4
980e3cc

只要你的‘sha短名’(Partial Sha)是不重复的(unique),它就不会和其它名字冲突(如果你使用了 5 个字节以上那是很难重复的),git也会把‘sha短名’(Partial Sha)自动补全。

分支,Remote 或 标签

你可以使用分支,remote或标签名来代替SHA串名,它们只是指向某个对象的指针。假设你的 master 分支目前在提交(commit):‘980e3’上,现在把它推送(push)到 origin 上并把它命名为标签‘v1.0’, 那么下面的串都会被 git 视为等价的:

980e3ccdaac54a0d4de358f3fe5d718027d96aae
origin/master
refs/remotes/origin/master
master
refs/heads/master
v1.0
refs/tags/v1.0

这意味着你执行下面的两条命令会有同样的输出:

$ git log master

$ git log refs/tags/v1.0

日期标识符

Git 的引用日志(Ref Log)可以让你做一些‘相对’查询操作:

master@{yesterday}

master@{1 month ago}

上面的第一条命令是:master 分支的昨天状态(head)的缩写。注意:即使在两个有相同 master 分支指向的仓库上执行这条命令,但是如果这个两个仓库在不同机器上,那么执行结果也很可能会不一样。

译者注:因为两个不同机器上的仓库的历史一般很难相同。

顺序标识符

这种格式用来表达某点前面的第 N 个提交(ref)。

master@{5}

上面的表达式代表着 master 前面的第 5 个提交(ref)。

多个父对象

这能告诉你某个提交的第 N 个直接父提交(parent)。 这种格式在合并提交(merge commits)时特别有用,这样就可以使提交对象(commit object)有多于一个直接父对象(direct parent)。

译者注:假设 master 是由 a 和 b 两个分支合并的,那么 master^1 是指分支 a,master^2 就是指分支 b。

master^2

波浪号

波浪号用来标识一个提交对象(commit object)的第 N 级嫡(祖)父对象(Nth grandparent)。例如:

master~2

就代表 master 所指向的提交对象的第一个父对象的第一个父对象(译者:你可以理解成是嫡系爷爷)。 它和下面的这个表达式是等价的:

master^^

你也可以把这些‘标识符’(spec)叠加起来,下面这个 3 个表达式都是指向同一个提交(commit):

master^^^^^^
master~3^~2
master~6

树对象指针

如果大家对第一章 Git 对象模型还有印象的话,就记得提交对象(commit object)是指向一个树对象(tree object)的。假如你要得到一个提交对象(commit object)指向的树对象(tree object)的 sha 串名,你就可以在‘树名’的后面加上‘{tree}’来得到它:

master^{tree}

二进制标识符

如果你要某个二次制对象(blob)的 sha 串名,你可以在‘树名’(treeish)后添加二次制对象(blob)对应的文件路径来得到它。

master:/path/to/file

区间

最后,你可以用..来指两个提交(commit)之间的区间。下面的命令会给出你在“7b593b5”和“51bea1”之间除了“7b593b5”外的所有提交(commit)(注意:51bea1 是最近的提交).

7b593b5..51bea1

这会包括所有 从 7b593b 开始的提交(commit)。译者注:相当于7b593b..HEAD

7b593b.. 
上一篇: 储藏 下一篇: 追踪分支