Подтвердить что ты не робот

HEAD ~ vs HEAD ^ vs HEAD @{}, также известный как тильда против карета против знака

HEAD - это указатель на текущую ветку. Я видел множество обозначений для предков HEAD, включая

Что означает каждое из указанных выше? Где документация для этого?

4b9b3361

Ответ 1

Из документов здесь.

  • HEAD~2: 2 фиксирует старше чем HEAD
  • HEAD^2: второй родитель HEAD, если HEAD было слиянием, иначе незаконно
  • [email protected]{2}: относится к 3-му списку в обзоре git reflog
  • 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^ 

Ответ 2

справочные суффиксы git (^ N, ~ N, @{...})

ref~ является сокращением для ref~1 и означает фиксацию первого родителя. ref~2 означает фиксацию первого родителя первым родителем. ref~3 означает фиксацию первого родителя, первого родителя, первого родителя. И так далее.

ref^ является сокращением для ref^1 и означает фиксацию первого родителя. Но разница между ними заключается в том, что ref^2 означает коммит второго родителя (помните, что коммиты могут иметь двух родителей, когда они являются слиянием).

Операторы ^ и ~ могут быть объединены.

Вот диаграмма, показывающая, как ссылаться на различные коммиты, используя HEAD в качестве отправной точки.
enter image description here

ЦСИ

Ответ 3

Я считаю каждый ~ или ^ означающим "возвращаться на один уровень назад". Если рядом с ~ стоит число (например, ~n), то n действует как множитель. Если рядом с ^ стоит число (например, ^n), то n - это n-й родительский элемент (или боковое движение, идущее из позиции слева направо в столбце 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

git log --online --graph затрудняют просмотр того, какие коммиты находятся на одном уровне, поэтому вот еще одна презентация (где "A" - последний коммит, а более старые коммиты находятся вверху):

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A

(Иллюстрации взяты из разницы между HEAD ^ и HEAD ~ в Git?).