我注意到,可以使用^
或~
字符指定实际提交的祖先。例如,如果我有以下提交的日志
* 1990f31 Somme third commit message
* k135145 Somme second commit message
* 2c13521 Somme first commit message
那么我可以知道哪个是1990f31
与HEAD^1
(或等同于HEAD~1
(的父提交,哪个是k135145
。
现在,我还读到,当它是合并提交时,可以组合^
或~
。因此,有人能提供一个例子来说明在键入git show HEAD~n^k
时的提交引用吗?或者通过转换像git show HEAD^k~n
这样的运算符来说明提交引用?,其中,我将n
和k
视为表示正整数的抽象。
HEAD
始终在您所在的位置。HEAD~n
表示回溯的第n次修订(总是取第一个父项(。HEAD~n^k
意味着,从HEAD
返回的第n个修订,取第k个父项(HEAD~n
是具有至少k个父级的合并修订(。
~
和^
是运算符,可以用来指定提交历史中的任何祖先。
让我们从一个图表开始:
* aa (HEAD, master) commit
* bb merged branch `some/feature` into master
|
| * cc (some/feature) feature: completed
| * dd feature: wip
| * ff feature: start
* | gg some fix on master
|/
* hh some commit on master
~
将进入第一个父母的链:aa~
是bb
,aa~2
是gg
,aa~3
是hh
cc~
是dd
,cc~2
是ff
,cc~3
也是hh
- 但是单独使用
~
,从aa
开始,您将无法探索some/feature
分支:在合并点(bb
(,cc
是bb
的第二个父级 - 注意,
~n
是重复n次的~~...~
的快捷方式,例如:aa~3
与aa~~~
相同
^
将只上升一个级别,但允许您检查n-th
父级是否有多个父级的提交- 调用
xx^
与xx~
相同:在这两种情况下,它都是xx
的第一个父级 aa
是一个常规提交,有一个单亲:所以aa^
是bb
(与aa~
相同(,aa^2
不存在bb
是合并提交,有两个父级:bb^
是gg
(与bb~
相同(,bb^2
是cc
,bb^3
不存在- 请注意,
^n
是而不是^^...^
的快捷方式,例如:bb^2
是bb
的第二个父级(它是cc
(bb^^
是bb
的第一个父级的第一个母级(它就是hh
(
- 调用
在某些情况下,您可以有octopus合并提交,它可能有xx^3
、xx^4
。。。父母
通过组合运算符,您可以";导航";对任何祖先的承诺。
例如,从aa
开始,到达ff
的一种方法是:
aa~^2~2
# some other ways to describe a path to reach `ff` :
aa^^2~2 # to reach the first parent, ~ or ^ are equivalent
aa~^2~~ # ~2 is the same as ~~
aa^^2^^
...
通常,不能切换~
和^
序列,因为它们不会指向同一提交
例如:
aa~^2 # points at cc
aa^2~ # does not exist
任何指向提交的东西都可以与上面的aa
、bb
或cc
相提并论:
HEAD
、sha1
、some/branch
、some/tag
- git已知的其他一些引用:
stash@{0}
(存储中的项(、HEAD@{3}
(HEAD
的reflog中的元素(、master@{2}
(master
分支的reflog(