下载初始化仓库
一:使用短的SHA-1值,看单一commit对象 以及查找分支指向的commit的SHA-1值
$ git log

查看所有的commit信息
$ git show c13a95
$ git show c13a954827345b01eec8bd29d462e239b0bde176

用短的SHA-1和用长的SHA-1结果一样,小项目一般SHA-1用短的就可以,超级大的项目才会出现短的SHA-1指向两个对象,那就再用长一点的,用8-10就算极限啦,linux内核也就用11位
$ git log --abbrev-commit --pretty=oneline

git log 的--abbrev-commit参数列出默认前7位SHA-1值,前提是保证它们是独一无二的,如果会重复,这个命令会自动输出更长一点的,比如8位SHA-1值
$ git show master
$ git show c13a954827345b01eec8bd29d462e239b0bde176

git命令里面,任何需要用commit的SHA-1值的地方都可以用指向它的branch名字代替,就是指branch的最后一个commit
$ git rev-parse master
$ git rev-parse HEAD

使用低级命令git rev-parse + 分支名字或者HEAD 可以看分支指向的commit的SHA-1
$ git reflog

git reflog查看HEAD指向分支指向的commit的历史记录
$ git checkout -b test
$ git checkout master

新建并且换到test分支

然后再切换回master
$ git log --abbrev-commit --pretty=oneline --all --decorate --graph

现在的分支结构图
$ git reflog

再次查看reflog,可以看到虽然master和test两个分支一直在c13a954这个commit上,但是reflog还是进行啦记录,前三行的SHA-1是一样的。
$ git show HEAD@{2}

用HEAD@{2},其实就等于git show c13a954 ,就是上一张图reflog显示的信息中的SHA-1值对应的commit的详细信息。
$ git log -g

以log的形式显示reflog的信息,就是比git reflog更加完整的信息,里面还是有HEAD@{1}这种信息
$ git show master@{yesterday}

git show还可以看 master分支昨天所在的commit信息
$ git show HEAD@{1.hours.ago}
$ git show master@{1.hours.ago}

因为HEAD现在处于master分支,所以上面两个命令结果相同,都显示对应的那个commit的详细信息
$ git show test@{3.hours.ago}

而对于刚刚创建的test分支,输出结果第一行说啦,3小时前没有test,但还是显示啦当前所指向的那个commit的详细信息
二:查看祖先commit信息,已对仓库进行一些修改,下载仓库
$ git log --abbrev-commit --pretty=oneline --all --decorate --graph

修改后,仓库的分支结构图
$ git show HEAD^

从上面的分支结构图可知,现在HEAD指向test分支,test位于fe36b80这个commit上,而HEAD^表示HEAD的父亲,那就是分支结构图中那个fff145commit啦,所以结果就是这个commit的详细信息
$ git show fff1455^

上面分支结构图中,fff1455是一个merge commit,所以有两个祖先,git show fff1455^代表merge时所在分支的祖先,而merge操作是git merge master,当时在test分支,所以显示的test分支上的那个祖先
$ git show fff1455^2

在^符号后加上数字2,代表的就是另一个分支master上的祖先啦
$ git show HEAD~
$ git show HEAD^

上面的两个命令等价,结果都是当前commit的第一个祖先
$ git show HEAD~3
$ git show HEAD^^^

这两个命令的结果也是一样的,都是当前所在commit在test分支上的第三个祖先c13a95
$ git show HEAD~^2

仓库的分支结构图

~和^两个符号也可以组合使用,~代表第一个祖先,^2代表位于master分支上的第二个祖先,也就是e2e1946
$ git show HEAD~^
$ git show HEAD~~
$ git show HEAD^^

上面三个命令也等价,都表示但前所在分支(test分支)上的第二个祖先fde260
查找某个范围内的commit对象

分支结构图
两个点,表示查看
experiment上还没有合并到master的commit,换句话说:所有experiment能读取到但master读取不到的commit对象
$ git log master..experiment
D
C
反过来就是E、F这两个master分支上的还没有合并到experiment的commit对象
$ git log experiment..master
F
E
所以,下面就是HEAD本地还没有推送到服务器的commit对象啦
$ git log origin/master..HEAD
符号..的两边有一边缺失,Git会自动用HEAD代替
git log origin/master..
再下载一下仓库
$ git log --abbrev-commit --pretty=oneline --all --decorate --graph

master\test\experiment三个分支,有1个共同的commit,三个各自的commit
$ git log master..test
$ git log ^master test
$ git log test --not master

上面三个命令等价,都是显示test有而master没有的commit,也可以说是没有合并到master的test上的commit
符号`^` 和 选项`--not`都表示不显示存在于该分支上的commit
$ git log test master --not experiment
$ git log test master ^experiment

使用符号`^` 和 选项`--not`,可以写多个branch,这是`..`符号做不到的,用这两种符号,可以查看多个branch,比如上面的命令显示test和master分支的commit且不显示experiment能够触及的commit
$ git log test...master

三个点`...`的符号,表示显示test、master的所有commit,但不显示两个分支共有的commit
$ git log --left-right test...master

这个命令中`--left-right`,就是用来指出列出的commit所属的分支,图里面可以看到,每个commit和SHA-1值之间都有`>`和`<`箭头,表示commit属于哪一边。