@
HEAD 的简写。
如:
$ git rev-parse @
39cacbb938eaab77d33f47a16d0a4e27e42d6a25
$ git rev-parse HEAD
39cacbb938eaab77d33f47a16d0a4e27e42d6a25
$ git cat-file -t 39cacbb938eaab77d33f47a16d0a4e27e42d6a25
commit
从中看出,@ 与 HEAD 完全指向同一个 commit 结点。
^
跟在提交结点之后 ,用于查看当前结点的祖先提交结点。
几个 ^ 就表示第几代祖先。如 ^ 表示父结点(即第一代祖先结点);^^ 表示祖先结点(即父结点的父结点),依次类推。
^num 表示当前结点的第几父结点,该语法只用于 merge 产生的结点。因为此种结点至少有两个父结点,^1 表示第一父结点(也即是合并是当前分支所在的结点),^2 表示第二父结点(即除 ^1 外的结点)。当结点没有多个父结点时,使用 ^num 会报错。如:
$ git rev-parse HEAD^2
HEAD^2
fatal: ambiguous argument 'HEAD^2': unknown revision or path not in the working tree.
~
用于查看当前结点的祖先提交结点。
HEAD~ 与 HEAD^ 完全等价,都指向当前提交结点的父结点。使用多个 ~ 与 ^ 时,效果也完全一样。
HEAD~num 与 HEAD^num 完全不一样。前者表示第几代祖先结点,后者表示当前结点的第几个父结点。
$ git rev-parse HEAD~2
9b335a39f65dff232f239c08baeeb9f7d27f193a
$ git rev-parse HEAD^2
HEAD^2
fatal: ambiguous argument 'HEAD^2': unknown revision or path not in the working tree.
第一个命令用于获取当前结点的祖父结点,第二个命令用于获取当前结点的第二个父结点(只不过当前结点没有)。
- 可以将 ~ 与 ^ 结合使用。如
$ git rev-parse HEAD~3^2
..
选出在一个分支中而不在另一个分支中的提交。
其格式为 branch1..branch2
表示在 branch2 分支中却不在 branch1 中的提交结点。
$ git log dev..master
该操作会列出不在 dev 分支却在 master 分支中的提交结点。反过来,如果想查找在 dev 分支却不在 master 分支中的,可以写成 master..dev
。
branch1 或 branch2 可以使用远程分支。如
git log origin/master..HEAD
表示远程 master 无但当前分支有的结点。如果省略了其中的一边, Git 会默认为 HEAD。 如
git log dev..
与git log dev..HEAD
完全等价。
--not 与 ^
^ 跟在引用之前时,表示欲查询的提交不存储于该引用之中。 --not 与 ^ 类似。
要注意区分 ^ 位于引用之前与引用之后的区别。
如:
$ git log refA refB ^refC
$ git log refA refB --not refC
上述两个命令作用一样,都表示查询在 refA 或 refB ,但又不存在于 refC 中的结点。
因此,上面的 .. 命令也可用 --not 或 ^ 代替。下面三个命令是等价的,都表示查询存在于 refB 但不存在于 refA 中的提交:
$ git log refA..refB
$ git log ^refA refB
$ git log refB --not refA
^ 后跟的结点位置不一定处于最后,但 --not 位于最后。
...
用于获取只存在于一个引用中的提交。即两个引用的并集减去交集的部分。
如:
$ git log --left-right master...dev
commit < e46a0a492fa5a77a7709ba3d201c9a226297bce1
commit > db496c69ad86e2a4cb5f58a9da2b998498651080
commit > d7b0598e71391add76559f118186b39474468098
commit > 9b3a660fdeda67bd8dcf428719eaf84b1fb412f2
其中 --left-right 用于指向当前的提交到底属性哪个引用。< 表示属于 ... 前的引用,> 表示属于 ... 后的引用。