HEAD~vs HEAD ^ vs HEAD @ {}也称为波浪号vs符号vs符号

时间:2014-11-06 16:59:53

标签: git

HEAD是当前分支的指针。我已经看到了HEAD祖先的各种符号,包括

  • HEAD~2
  • HEAD^2
  • HEAD@{2}
  • HEAD~~
  • HEAD^^

上述每一个意味着什么?这方面的文件在哪里?

3 个答案:

答案 0 :(得分:57)

来自文档here

  • HEAD~2:2提交比HEAD更早
  • HEAD^2:HEAD的第二个父级,如果HEAD是合并,则为非法
  • HEAD@{2}:引用git reflog
  • 概述中的第3个列表
  • HEAD~~:2提交比HEAD更早
  • HEAD^^:2提交比HEAD更早

如果HEAD是合并,那么

  • 第一个父级是我们合并的分支,
  • 第二个父级是我们合并的分支。

某些组合和同义词

First Parent    First Grandparent    Second Parent    Second Grandparent

HEAD~
HEAD^
HEAD~1          HEAD~2               HEAD^2           HEAD^2~        
HEAD^1          HEAD^^                                HEAD^2^ 

答案 1 :(得分:14)

  

git reference suffixes(^ N,~N,@ {...})

ref~ref~1的简写,表示提交的第一个父级。 ref~2表示提交的第一个父母的第一个父母。 ref~3表示提交的第一个父母的第一个父母的第一个父母。等等。

ref^ref^1的简写,表示提交的第一个父级。但是两者的不同之处在于ref^2表示提交的第二个父级(请记住,提交在合并时可以有两个父级)。

可以组合^和〜运算符。

这里的图表显示了如何使用HEAD作为起点引用各种提交 enter image description here

src

答案 2 :(得分:0)

我计算每个~^的意思是“返回上一级”。如果~旁边有一个数字(例如~n),则n用作乘法器。如果^旁边有一个数字(例如^n),则n是要使用的第n个父对象(或在{{1}中从左到右列位置的横向移动}。

示例:

git log --graph

上述标记的坐标:

$ git log --oneline --graph 
*   29392c8 (HEAD -> master, tag: A) A
|\
| * a1ef6fd (tag: C) C
| |
|  \
*-. \   8ae20e9 (tag: B) B
|\ \ \
| | |/
| | *   03160db (tag: F) F
| | |\
| | | * 9df28cb (tag: J) J
| | * 2afd329 (tag: I) I
| * a77cb1f (tag: E) E
*   cd75703 (tag: D) D
|\
| * 3043d25 (tag: H) H
* 4ab0473 (tag: G) G

A = = A^0 B = A^ = A^1 = A~1 C = A^2 D = A^^ = A^1^1 = A~2 E = B^2 = A^^2 F = B^3 = A^^3 G = A^^^ = A^1^1^1 = A~3 H = D^2 = B^^2 = A^^^2 = A~2^2 I = F^ = B^3^ = A^^3^ J = F^2 = B^3^2 = A^^3^2 输出使您很难看到哪些提交处于同一级别,因此这是另一个演示文稿(其中“ A”是最新的提交,而较旧的提交在顶部):

git log --online --graph

(插图摘自What's the difference between HEAD^ and HEAD~ in Git?)。