HEAD〜n ^ k对git有什么作用?

问题描述

我注意到,可以使用^~字符来指定实际提交的祖先。例如,如果我有以下提交日志

* 1990f31 Somme third commit message 
* k135145 Somme second commit message 
* 2c13521 Somme first commit message 

然后我可以知道哪个是1990f31HEAD^1的{​​{1}}的父提交,即HEAD~1

现在,我也read表示,如果是合并提交,则可以合并k135145^。因此,有人可以提供一个示例来举例说明在键入~ 时提交提交引用,或者通过将git show HEAD~n^k这样的运算符换行吗?在这里我将git show HEAD^k~nn视为抽象代表一个正整数。

解决方法

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~bbaa~2ggaa~3hh
    • cc~ddcc~2ffcc~3也是hh
    • 但仅使用~并从aa开始,您将无法浏览some/feature分支:在合并点(bb),{{ 1}}是cc
    • second 父级
    • 请注意,bb~n重复n次的快捷方式,例如:~~...~aa~3相同
  • aa~~~仅会升一级,但允许您检查^父对象中有多个父对象的提交

    • 呼叫n-thxx^相同:在这两种情况下,它都是xx~的第一个父级
    • xx是一个常规提交,具有一个单亲:因此,aaaa^(与bb相同),aa~不存在
    • aa^2是一个合并提交,有两个父级:bbbb^(与gg相同),bb~bb^2cc不存在
    • 请注意,bb^3不是^n的快捷方式,例如:
      ^^...^bb^2的第二个父级(它是bb
      ccbb^^的第一个父级的第一个父级(它是bb

在某些情况下,您可能会有章鱼合并提交,其中可能有hhxx^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 aabb的位置:

  • ccHEADsha1some/branch ...
  • 其他已知的git引用:some/tag(隐藏项),stash@{0}(引用HEAD@{3}中的元素),HEAD(引用日志中的元素master@{2}分支)
  • ...