不用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
~~~
## 日期標識符
The Ref Log that git keeps will allow you to do some relative stuff locally, such as:
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對象模型](http://gitbook.liuhui998.com/1_2.html)還有印象的話, 就記得提交對象(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..
~~~
- 1. 介紹
- 歡迎使用Git
- GIT對象模型
- Git目錄 與 工作目錄
- Git索引
- 2. 第一步
- 安裝Git
- 安裝與初始化
- 3. 基本用法
- 獲得一個Git倉庫
- 正常的工作流程
- 分支與合并@基礎
- 查看歷史 -Git日志
- 比較提交 - Git Diff
- 分布式的工作流程
- Git標簽
- 4. 中級技能
- 忽略某些文件
- rebase
- 交互式rebase
- 交互式添加
- 儲藏
- Git樹名
- 追蹤分支
- 使用Git Grep進行搜索
- Git的撤消操作 - 重置, 簽出 和 撤消
- 維護Git
- 建立一個公共倉庫
- 建立一個私有倉庫
- 5. 高級技能
- 創建新的空分支
- 修改你的歷史
- 高級分支與合并
- 查找問題的利器 - Git Bisect
- 查找問題的利器 - Git Blame
- Git和Email
- 定制Git
- Git Hooks
- 找回丟失的對象
- 子模塊
- 6. Git生態體系
- Git 與之 Windows
- 使用Git進行系統部署
- 與 Subversion 集成
- 從其他代碼管理工具遷移到Git
- 圖形化的Git
- Git倉庫托管
- Git的其它用法
- Git的腳本支持
- Git 與編輯器
- 7. 原理解析
- Git是如何存儲對象的
- 查看Git對象
- Git引用
- Git索引
- 打包文件
- 更底層的Git
- 傳輸協議
- 術語表