HEAD~n^k 在 git 上做什么?

What does HEAD~n^k does on git?

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

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

然后我可以知道哪个是 1990f31HEAD^1(或等同于 HEAD~1)的父提交,即 k135145.

现在,我还 read 合并提交时可以合并 ^~ 。因此,有人可以提供一个示例来说明在键入 git show HEAD~n^k 时的提交引用,或者通过像 git show HEAD^k~n 这样的运算符来交换吗?我正在考虑将 nk 作为抽象表示一个正整数。

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
  • ~ 将在 first parents :

    链中上升
    • aa~bbaa~2ggaa~3hh
    • cc~ddcc~2ffcc~3也是hh
    • 但单独使用 ~,并且从 aa 开始,您将无法探索 some/feature 分支:在合并点 (bb), ccbb
    • 第二个parent
    • 注意~n~~...~重复n次的快捷方式,例如:aa~3等同于aa~~~
  • ^ 只会上升一级,但允许您检查 n-th parent 是否有多个 parents

    • 调用 xx^xx~ 相同:在这两种情况下,它都是 xx
    • 的第一个 parent
    • aa 是一个常规提交,只有一个 parent:所以 aa^bb(与 aa~ 相同),aa^2不存在
    • bb 是合并提交,有 2 个 parents:bb^gg(与 bb~ 相同),bb^2ccbb^3不存在
    • 请注意 ^n 不是 ^^...^ 的快捷方式,例如:
      bb^2bb 的第二个 parent(即 cc
      bb^^bb的第一个parent的第一个parent(就是hh

在某些情况下,您可以进行章鱼合并提交,其中可能有 xx^3xx^4 ... parents.


通过组合运算符,您可以“导航”到任何祖先提交。

例如,从 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

任何指向提交的内容都可以代替上面的 aabbcc :

  • HEAD,一个sha1,some/branch,some/tag ...
  • git 已知的一些其他引用:stash@{0}(藏品中的项目),HEAD@{3}HEAD 的 reflog 中的元素),master@{2}master 分支的 reflog 中的元素)
  • ...