#### 版本表示法:git rev-parse
--git-dir顯示Git版本庫的位置 ? --show-cdup顯示當前工作區目錄的深度 ?--parseopt解析命令行參數
~~~
$ git rev-parse --symbolic --branches 顯示分支
$ git rev-parse --symbolic --tags 顯示里程碑
$ git rev-parse --symbolic --glob=refs/* 顯示定義的所有引用。其中refs/remotes/目錄下的引用稱為遠程分支(或遠程引用)
$ git rev-parse HEAD 顯示HEAD對應的SHA1哈希值
$ git rev-parse A^{tree} A: 顯示里程碑A對應的目錄樹
$ git rev-parse A^{tree}:src/Makefile A:src/Makefile 顯示樹里面的文件
$ git rev-parse :/"commit A" 通過在提交日志中查找字串的方式顯示提交
~~~
#### 版本范圍表示法:git rev-list
一個提交ID實際上就可以代表一個版本列表,含義是該版本的所有歷史提交 $git rev-list --oneline A
兩個或多個版本,相當于每個版本單獨使用時指代的列表的并集
在一個版本前面加上符號^含義是取反,即排除這個版本及其歷史版本 ^G D等價于G..D
...表示法含義是兩個版本共同能訪問到的除外
B^@表示某提交的歷史提交,自身除外
B^!表示提交本身不包括其歷史提交
#### 瀏覽日志:git log
后面可以接表示版本范圍的參數(如上git rev-list)
--graph參數可以顯示字符界面的提交關系圖,而且不同的分支可以用不同的顏色表示
-<n>顯示最近的n條日志
-p可以在顯示日志的時候同時顯示改動
當不需要知道具體的改動而只想知道改動在哪些文件上時可以使用--stat參數
--pretty=raw顯示commit的原始數據,可以顯示提交對應的樹ID
--pretty=fuller同時顯示作者和提交者,兩者可以不同
--pretty=oneline提供最精簡的日志輸出,也可以使用--oneline參數
如果只想查看和分析某一個提交,也可以使用git cat-file(-p參數的含義是美觀的輸出)或git show命令
#### 差異比較:git diff
~~~
$ git diff B A 比較里程碑B和里程碑A
$ git diff A 比較工作區和里程碑A
$ git diff --cached A 比較暫存區和里程碑A
$ git diff 比較工作區和暫存區
$ git diff --cached 比較暫存區和HEAD
$ git diff HEAD 比較工作區和HEAD
$ git diff <commit1> <commit2> -- <paths> 顯示不同版本間該路徑下的文件差異
$ git diff <path1> <path2> 可以在Git版本庫之外執行,對非Git目錄進行比較
$ git diff --word-diff 逐詞比較
~~~
#### 文件追溯:git blame
在軟件開發過程中當發現bug并定位到具體代碼時,可以指出何時和什么版本引入的此bug。
當針對文件執行git blame命令時,就會逐行顯示文件,在每一行的行首顯示此行最早是在什么版本引入的,由誰引入的
如果只想顯示某幾行,使用-L n,m參數
#### 二分查找:git bisect
~~~
$ git bisect start 開始二分查找
$ git bisect bad A 將A版本標記為壞提交
$git bisect good 將當前版本標記為好提交
$ git checkout bisect/bad 切換到最終定位的壞提交版本
$ git bisect reset 當對bug定位和修復后,撤銷二分查找在版本庫中遺留的臨時文件和引用。撤銷二分查找后,版本庫切換回執行二分查找之前所在的分支
~~~
**如果把好提交當成了壞提交:**
~~~
$ git bisect log > logfile 把二分查找的日志保存在一個文件中,編輯這個文件,刪除記錄了錯誤動作的行。
$ git bisect reset 結束正在進行的出錯的二分查找
$ git bisect replay logfile 通過日志文件恢復進度,重啟二分查找
~~~
**自動化測試:**
支持run子命令,可以運行一個自動化測試腳本,實現自動的二分查找。若腳本退出碼為0,正在測試的版本是一個好版本;退出碼為125,正在測試的版本被跳過;退出碼為1~127(125除外),正在測試的版本是一個壞版本
測試腳本good-or-bad.sh,步驟如下:
~~~
(1)$ git bisect start master G 從已知的壞版本master和好版本G開始新一輪的二分查找
(2)$ git bisect run sh good-or-bad.sh 自動化測試
(3)$ git describe refs/bisect/bad 顯示定義到的壞版本
~~~
#### 獲取文件歷史版本命令:
~~~
$ git ls-tree <tree-ish> <paths> 查看歷史提交的目錄樹
$ git checkout <commit> 整個工作區切換到歷史版本
$ git checkout <commit> -- <paths> 檢出某文件的歷史版本
$ git show <commit>:<file> > new_name 檢出某文件的歷史版本到其他文件名
~~~