问题描述
我注意到,可以使用^
或~
字符来指定实际提交的祖先。例如,如果我有以下提交日志
* 1990f31 Somme third commit message
* k135145 Somme second commit message
* 2c13521 Somme first commit message
然后我可以知道哪个是1990f31
和HEAD^1
的{{1}}的父提交,即HEAD~1
。
现在,我也read表示,如果是合并提交,则可以合并k135145
或^
。因此,有人可以提供一个示例来举例说明在键入~
时提交提交引用,或者通过将git show HEAD~n^k
这样的运算符换行吗?在这里我将git show HEAD^k~n
和n
视为抽象代表一个正整数。
解决方法
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
),{{ 1}}是cc
的 second 父级
- 请注意,
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
,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
... - 其他已知的git引用:
some/tag
(隐藏项),stash@{0}
(引用HEAD@{3}
中的元素),HEAD
(引用日志中的元素master@{2}
分支) - ...