0

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

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

然后我可以知道哪个是1990f31with HEAD^1(或等效地 with HEAD~1)的父提交,即k135145.

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

4

2 回答 2

4

HEAD永远是你在的地方。HEAD~n表示第 n 次修订(始终采用第一个父项)。HEAD~n^k意味着,从第 n 个修订版返回HEAD,取第 k 个父级(HEAD~n是具有至少 k 个父级的合并修订版)。

于 2020-08-16T23:50:30.430 回答
2

~并且^是可用于指定提交历史中的任何祖先的运算符。

让我们从一张图开始:

* 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),cc第二个父级bb
    • 请注意,这是重复 n 次~n的快捷方式,例如 :与~~...~aa~3aa~~~
  • ^只会上升一级,但允许您检查n-th父级是否有多个父级的提交

    • 调用xx^是一样的xx~:在这两种情况下,它都是第一个父xx
    • aa是一个常规提交,有一个单亲:所以aa^bb(与 相同aa~),aa^2不存在
    • bb是一个合并提交,有 2 个父母:bb^gg(与 相同bb~)、bb^2ccbb^3不存在
    • 请注意,这不是^n的快捷方式,例如:is the second parent of (it is ) is the first parent of the first parent of (it is )^^...^
      bb^2bbcc
      bb^^bbhh

在某些情况下,你可以有章鱼合并提交,它可能有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,bbcc以上:

  • HEAD, 一sha1, some/branch, some/tag...
  • git已知的其他一些参考:(stash@{0}存储中的项目),HEAD@{3}(参考日志中的元素HEAD),master@{2}master分支参考日志中的元素)
  • ...
于 2020-08-17T06:42:09.600 回答