在使用git rebase
命令时,我们常常想要rebase到HEAD的前n个commit,通常我们使用如下命令:
git rebase -i HEAD~n
然而有时候我们能看到这样的表达方式:
git rebase -i HEAD^1
那么~和^的区别在哪里呢?我们首先看一下这张图:
我们可以看到,最新的commit为HEAD,那么HEAD的前一个commit就为HEAD~1,HEAD的前两个commit就为HEAD~2。。。
注意从HEAD~3上新开了一个分支,并出现一个蓝色的commit。之后进行merge操作,蓝色的commit和HEAD~2合并成一个新的commit:HEAD~1。
此时我们可以看到HEAD~1实际上拥有了两个parent,第一个parents是HEAD~2,第二个parent则是蓝色的新分支上的commit,那么此时就是^符号使用的场景了。
^符号表示某个commit父commit所在层中的第几个parent,由于HEAD~1拥有两个父亲commit,因此这儿就需要使用^符号表示图中蓝色的commit,即HEAD~1^2。
下图能够更清晰的表现出commit树的概念:
其中commit G可以这样表示:
A~3
或者这样表示:
A~2^1
commit H则可以这样表示:
A~2^2
总结一下:
- ~2表示沿着commit树向上搜索两层,并获得该层的第一个commit(如果该层有多个commit的话)
- ^2表示获得某个commit的第2个父commit(merge两个分支后产生的merge commit就拥有两个父commit)