HEAD - это указатель на текущую ветку. Я видел множество обозначений для предков HEAD, включая
-
HEAD~2 -
HEAD^2 -
[email protected]{2} -
HEAD~~ -
HEAD^^
Что означает каждое из указанных выше? Где документация для этого?
HEAD - это указатель на текущую ветку. Я видел множество обозначений для предков HEAD, включая
HEAD~2HEAD^2[email protected]{2}HEAD~~HEAD^^Что означает каждое из указанных выше? Где документация для этого?
Из документов здесь.
HEAD~2: 2 фиксирует старше чем HEADHEAD^2: второй родитель HEAD, если HEAD было слиянием, иначе незаконно[email protected]{2}: относится к 3-му списку в обзоре git reflogHEAD~~: 2 коммитов старше, чем HEADHEAD^^: 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^
справочные суффиксы git (^ N, ~ N, @{...})
ref~ является сокращением для ref~1 и означает фиксацию первого родителя. ref~2 означает фиксацию первого родителя первым родителем. ref~3 означает фиксацию первого родителя, первого родителя, первого родителя. И так далее.
ref^ является сокращением для ref^1 и означает фиксацию первого родителя. Но разница между ними заключается в том, что ref^2 означает коммит второго родителя (помните, что коммиты могут иметь двух родителей, когда они являются слиянием).
Операторы ^ и ~ могут быть объединены.
Вот диаграмма, показывающая, как ссылаться на различные коммиты, используя HEAD в качестве отправной точки. 
Я считаю каждый ~ или ^ означающим "возвращаться на один уровень назад". Если рядом с ~ стоит число (например, ~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?).