Ссылки особенно плохи, когда они сломаны. Вот почему безопаснее ответить на вопрос, который помогает предотвратить это из-за возможности скопировать и вставить некоторые объяснения :)
Самуил
Ответы:
763
Эмпирические правила
Используйте ~большую часть времени - чтобы вернуться на несколько поколений, обычно то, что вы хотите
Используйте ^при коммитах слияния - потому что у них есть два или более (непосредственных) родителя
Мнемоника:
Тильда ~почти линейна по внешности и хочет идти назад по прямой
Карет ^предлагает интересный отрезок дерева или развилку в дороге
<rev>~<n>Например,master~3
суффикс ~<n>к параметру ревизии означает объект фиксации, который является прародителем n- го поколения именованного объекта фиксации, следуя только первым родителям. Например, <rev>~3эквивалентно тому, <rev>^^^что эквивалентно <rev>^1^1^1...
Вы можете получить к родителям любой коммит, а не только HEAD. Вы также можете перемещаться назад по поколениям: например, master~2означает прародителя кончика главной ветви, отдавая предпочтение первому родителю при фиксации слияния.
знак вставки
История Git нелинейна: ориентированный ациклический граф (DAG) или дерево. Для коммита только с одним родителем rev~и rev^означают одно и то же. Селектор каретки становится полезным с коммитами слияния, потому что каждый из них является потомком двух или более родителей - и напрягает язык, заимствованный из биологии.
HEAD^означает первого непосредственного родителя кончика текущей ветви. HEAD^это сокращение от HEAD^1, и вы также можете обратиться HEAD^2и так далее, в зависимости от обстоятельств. Этот же раздел git rev-parseдокументации определяет его как
<rev>^, НапримерHEAD^ ,v1.5.1^0
суффикс ^к параметру пересмотра означает первый родитель, совершающий объект. ^<n>означает, что n- й родитель ([ например ] <rev>^эквивалентен <rev>^1). Как специальное правило, <rev>^0означает сам коммит и используется, когда <rev>это имя объекта тега, который ссылается на объект коммита.
Примеры
Эти спецификаторы или селекторы могут быть связаны произвольно, например , topic~3^2на английском языке является вторым родителем коммита слияния, который является пра-прародителем (три поколения назад) текущего наконечника ветви topic.
Вышеупомянутая часть git rev-parseдокументации отслеживает множество путей через условные истории мерзавца. Время течет в основном вниз. Коммиты D, F, B и A являются коммитами слияния.
Вот иллюстрация, Джон Лоелигер. Оба узла фиксации B и C являются родителями узла фиксации A. Родительские коммиты располагаются слева направо.
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
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, история которого соответствует приведенной иллюстрации.
#! /usr/bin/env perluse strict;use warnings;use subs qw/ postorder /;useFile::Temp qw/ mkdtemp /;my%sha1;my%parents =(
A =>[ qw/ B C /],
B =>[ qw/ D E F /],
C =>[ qw/ F /],
D =>[ qw/ G H /],
F =>[ qw/ I J /],);sub postorder {my($root,$hash)=@_;my@parents=@{ $parents{$root}||[]};
postorder($_, $hash)for@parents;
return if $sha1{$root};@parents= map "-p $sha1{$_}",@parents;
chomp($sha1{$root}=`git commit-tree @parents -m "$root" $hash`);die"$0: git commit-tree failed"if $?;
system("git tag -a -m '$sha1{$root}' '$root' '$sha1{$root}'")==0 or die"$0: git tag failed";}
$0 =~ s!^.*/!!; # / fix StackOverflow highlighting
my $repo = mkdtemp "repoXXXXXXXX";
chdir $repo or die"$0: chdir: $!";
system("git init")==0 or die"$0: git init failed";
chomp(my $tree =`git write-tree`);die"$0: git write-tree failed"if $?;
postorder 'A', $tree;
system "git update-ref HEAD $sha1{A}";die"$0: git update-ref failed"if $?;
system "git update-ref master $sha1{A}";die"$0: git update-ref failed"if $?;# for browsing history - http://blog.kfish.org/2010/04/git-lola.html
system "git config alias.lol 'log --graph --decorate --pretty=oneline --abbrev-commit'";
system "git config alias.lola 'log --graph --decorate --pretty=oneline --abbrev-commit --all'";
Он добавляет псевдонимы в новом одноразовом репо только для, git lolиgit lola поэтому вы можете просматривать историю как в
$ git lol
* 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
Обратите внимание, что на вашем компьютере имена объектов SHA-1 будут отличаться от указанных выше, но теги позволяют вам адресовать коммиты по имени и проверять ваше понимание.
$ git log -1 --format=%f $(git rev-parse A^)
B
$ git log -1 --format=%f $(git rev-parse A~^3~)
I
$ git log -1 --format=%f $(git rev-parse A^2~)
F
Совершить 89e4fcb0dd из собственной истории GIT является слияние фиксации, так как git show 89e4fcb0ddуказывает на то с строке заголовка Merge , который отображает имена объектов Непосредственным предков.
commit 89e4fcb0dd01b42e82b8f27f9a575111a26844df
Merge: c670b1f876 649bf3a42f b67d40adbb
Author: Junio C Hamano <gitster@pobox.com>
Date: Mon Oct 29 10:15:31 2018 +0900
Merge branches 'bp/reset-quiet' and 'js/mingw-http-ssl' into nd/config-split […]
Мы можем подтвердить порядок, попросив git rev-parseпоследовательно показать ближайших родителей 89e4fcb0dd.
Запрос несуществующего четвертого родителя приводит к ошибке.
$ git rev-parse 89e4fcb0dd^4
89e4fcb0dd^4
fatal: ambiguous argument '89e4fcb0dd^4': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Если вы хотите извлечь только родителей, используйте красивый формат%P для полных хэшей
Кажется, что ^ может справиться со всеми случаями, и можно задаться вопросом, почему ~ появился в первую очередь. Почему бы не вспомнить только, как ^ работает?
СБУ
это все еще сбивает с толку ... если предположить, что G ГОЛОВА, так что если я сделаю ГОЛОВУ ^, это будет D ... верно?
Патоши パ ト シ
12
@ Duckx график на самом деле идет сверху вниз, поэтому A - это самый последний коммит, а G - один из самых старых. Путь от G к D - прямой, а не обратный, насколько я могу судить.
goldenratio
@SimonBudin Я думаю, это не очень удобно использовать ^^^^^^^вместо ~7, это? Вот почему ~полезно
YakovL
1
@AdityaVikasDevarapalli Это было бы хорошо, как его собственный вопрос.
Эта документация может быть немного неясной для начинающих, поэтому я воспроизвел эту иллюстрацию ниже:
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
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
Всего один вопрос. Как коммит может иметь более двух родителей? (См. B - это родители D, E и F). Я полагаю, что единственный способ, которым коммит может иметь двух родителей, - это коммит слияния ... но как вы можете слить 3 коммита одновременно?
Циков
Если я не ошибаюсь, это может быть очевидным, но я думаю, что следует указать, что HEAD ~ следует текущей ветви (как Диего Диас, упомянутый ниже).
Фибоно
2
Кроме того, F = A^2^.
Матин Улхак
2
Таким образом, ^ == ^1 == LEFTMOST PARENT, ^2 == SECOND LEFTMOST PARENTи так далее. И ~ == ~1 == LEFTMOST PARENT, ~2 == LEFTMOST PARENTS LEFTMOST PARENT == LEFTMOST GRANDPARENT. По расширению,~2^2 == LEFTMOST GRANDPARENTS SECOND LEFTMOST PARENT
Александр Торстлинг
1
@AlexanderTorstling это было очень полезно для меня. Однако что здесь означает левый и правый?
polynomial_donut
287
И то, ~и другое ^ссылается на родителя коммита ( ~~и ^^оба ссылаются на коммит деда и т. Д.) Но они различаются по значению, когда используются с числами:
~2означает два уровня в иерархии , через первого родителя, если коммит имеет более одного родителя
^2означает второго родителя, где коммит имеет более одного родителя (т. е. потому что это слияние)
Они могут быть объединены, так что HEAD~2^3означает HEADтретий родительский коммит.
Если бы я понял это правильно, фиксаций A, B, D, Gнаходятся на одной и той же отрасли и фиксации Dявляется слияние Gи H, следовательно , наличие двух родителей. Таким образом, commit ( H) из другой ветки является ссылкой ^2.
ref~является сокращением ref~1и означает первого родителя коммита. ref~2означает первого родителя коммитов. ref~3означает первого родителя первого родителя коммита. И так далее.
ref^является сокращением ref^1и означает первого родителя коммита. Но если эти два различия отличаются, это ref^2означает, что второй родитель коммита (помните, что коммиты могут иметь двух родителей, когда они являются слиянием).
Спасибо за фактическое объяснение различий, а не за публикацию множества примеров.
Кирк Бродхерст
32
^<n>Формат позволяет выбрать п - ю родителя коммита (соответствующий в слияниях). ~<n>Формат позволяет выбрать NTH предок фиксации, всегда после первого родителя. Посмотрите документацию git-rev-parse для некоторых примеров.
Стоит отметить, что в git также есть синтаксис для отслеживания «откуда ты пришел» / «хочу вернуться назад» - например, HEAD@{1}будет ссылаться на то место, откуда ты перешел на новое место для фиксации.
В основном HEAD@{}переменные фиксируют историю движения HEAD, и вы можете решить использовать конкретную голову, изучив повторные журналы команды git git reflog.
Пример:
0aee51f HEAD@{0}: reset: moving to HEAD@{5}
290e035 HEAD@{1}: reset: moving to HEAD@{7}
0aee51f HEAD@{2}: reset: moving to HEAD@{3}
290e035 HEAD@{3}: reset: moving to HEAD@{3}
9e77426 HEAD@{4}: reset: moving to HEAD@{3}
290e035 HEAD@{5}: reset: moving to HEAD@{3}
0aee51f HEAD@{6}: reset: moving to HEAD@{3}
290e035 HEAD@{7}: reset: moving to HEAD@{3}
9e77426 HEAD@{8}: reset: moving to HEAD@{3}
290e035 HEAD@{9}: reset: moving to HEAD@{1}
0aee51f HEAD@{10}: reset: moving to HEAD@{4}
290e035 HEAD@{11}: reset: moving to HEAD^
9e77426 HEAD@{12}: reset: moving to HEAD^
eb48179 HEAD@{13}: reset: moving to HEAD~
f916d93 HEAD@{14}: reset: moving to HEAD~
0aee51f HEAD@{15}: reset: moving to HEAD@{5}
f19fd9b HEAD@{16}: reset: moving to HEAD~1
290e035 HEAD@{17}: reset: moving to HEAD~2
eb48179 HEAD@{18}: reset: moving to HEAD~2
0aee51f HEAD@{19}: reset: moving to HEAD@{5}
eb48179 HEAD@{20}: reset: moving to HEAD~2
0aee51f HEAD@{21}: reset: moving to HEAD@{1}
f916d93 HEAD@{22}: reset: moving to HEAD@{1}
0aee51f HEAD@{23}: reset: moving to HEAD@{1}
f916d93 HEAD@{24}: reset: moving to HEAD^
0aee51f HEAD@{25}: commit (amend): 3rd commmit
35a7332 HEAD@{26}: checkout: moving from temp2_new_br to temp2_new_br
35a7332 HEAD@{27}: commit (amend): 3rd commmit
72c0be8 HEAD@{28}: commit (amend): 3rd commmit
Примером может быть то, что я выполнил локальные коммиты a-> b-> c-> d, а затем вернулся к отмене 2 коммитов, чтобы проверить мой код - git reset HEAD~2- а затем я хочу переместить свою HEAD обратно в d - git reset HEAD@{1}.
~ это то, что вы хотите большую часть времени, оно ссылается на прошлые коммиты на текущую ветку
^ ссылается на родителей (git-merge создает второго или более родителей)
A ~ всегда то же самое, что A ^
A ~~ всегда то же самое, что A ^^, и, следовательно,
A ~ 2 не то же самое, что A ^ 2,
потому что ~ 2 является сокращением для ~~,
а ^ 2 не сокращение для чего-либо, это означает, что 2-й родитель
Проще говоря, для первого уровня происхождения (происхождение, наследование, происхождение и т. Д.) HEAD ^ и HEAD ~ оба указывают на один и тот же коммит, который (расположен) на одного родителя выше HEAD (коммит).
Кроме того, ГОЛОВА ^ = ГОЛОВА ^ 1 = ГОЛОВА ~ = ГОЛОВА ~ 1. Но ГОЛОВА ^^! = ГОЛОВА ^ 2! = ГОЛОВА ~ 2. Еще ГОЛОВА ^^ = ГОЛОВА ~ 2. Читать дальше.
Помимо первого уровня происхождения, все становится сложнее, особенно если с рабочей веткой / главной ветвью произошли слияния (из других ветвей). Существует также вопрос синтаксиса с кареткой, HEAD ^^ = HEAD ~ 2 (они эквивалентны), НО HEAD ^^! = HEAD ^ 2 (это совершенно разные вещи).
Каждый / символ каретки относится к первому родителю HEAD, поэтому знаки, объединенные в строку, эквивалентны выражениям тильды, потому что они относятся к первым родителям первого родителя (первого родителя) и т. Д., И т. Д. И т. Д., Строго основываясь на количестве подключенных карет или на число после тильды (так или иначе, они оба означают одно и то же), то есть остаются с первым родителем и идут вверх на x поколений.
HEAD ~ 2 (или HEAD ^^) относится к коммиту, который является двумя уровнями происхождения выше / выше текущего коммита (HEAD) в иерархии, что означает коммит деда и дедушки HEAD.
HEAD ^ 2, с другой стороны, ссылается не на коммит второго родителя первого родителя, а просто на коммит второго родителя. Это связано с тем, что символ каретки означает родителя коммита, а следующий за ним номер указывает, на какой / какой родительский коммит ссылается (первый родитель в случае, когда за кареткой не следует число [потому что это сокращение для номера). будучи 1, означая первого родителя]). В отличие от каретки, число, которое следует после, не подразумевает другого уровня иерархии вверх, а скорее означает, сколько уровней вбок, в иерархии, нужно найти правильного родителя (commit). В отличие от числа в выражении тильды, это только один родительский элемент в иерархии, независимо от числа (непосредственно), идущего за кареткой. Вместо того, чтобы вверх, карет
Таким образом, HEAD ^ 3 равен третьему родителю коммита HEAD (НЕ пра-пра-прародитель, который будет HEAD ^^^ AND HEAD ~ 3 ...).
Ответы:
Эмпирические правила
~
большую часть времени - чтобы вернуться на несколько поколений, обычно то, что вы хотите^
при коммитах слияния - потому что у них есть два или более (непосредственных) родителяМнемоника:
~
почти линейна по внешности и хочет идти назад по прямой^
предлагает интересный отрезок дерева или развилку в дорогетильда
Раздел «Указание редакций»
git rev-parse
документации определяет~
какВы можете получить к родителям любой коммит, а не только
HEAD
. Вы также можете перемещаться назад по поколениям: например,master~2
означает прародителя кончика главной ветви, отдавая предпочтение первому родителю при фиксации слияния.знак вставки
История Git нелинейна: ориентированный ациклический граф (DAG) или дерево. Для коммита только с одним родителем
rev~
иrev^
означают одно и то же. Селектор каретки становится полезным с коммитами слияния, потому что каждый из них является потомком двух или более родителей - и напрягает язык, заимствованный из биологии.HEAD^
означает первого непосредственного родителя кончика текущей ветви.HEAD^
это сокращение отHEAD^1
, и вы также можете обратитьсяHEAD^2
и так далее, в зависимости от обстоятельств. Этот же разделgit rev-parse
документации определяет его какПримеры
Эти спецификаторы или селекторы могут быть связаны произвольно, например ,
topic~3^2
на английском языке является вторым родителем коммита слияния, который является пра-прародителем (три поколения назад) текущего наконечника ветвиtopic
.Вышеупомянутая часть
git rev-parse
документации отслеживает множество путей через условные истории мерзавца. Время течет в основном вниз. Коммиты D, F, B и A являются коммитами слияния.Запустите приведенный ниже код, чтобы создать репозиторий git, история которого соответствует приведенной иллюстрации.
Он добавляет псевдонимы в новом одноразовом репо только для,
git lol
иgit lola
поэтому вы можете просматривать историю как вОбратите внимание, что на вашем компьютере имена объектов SHA-1 будут отличаться от указанных выше, но теги позволяют вам адресовать коммиты по имени и проверять ваше понимание.
В «Задание Ревизии» в
git rev-parse
документации полна полезной информации и стоит углубленное чтение. Смотрите также Git Tools - Выбор редакции из книги Pro Git .Порядок родительских комиссий
Совершить 89e4fcb0dd из собственной истории GIT является слияние фиксации, так как
git show 89e4fcb0dd
указывает на то с строке заголовка Merge , который отображает имена объектов Непосредственным предков.Мы можем подтвердить порядок, попросив
git rev-parse
последовательно показать ближайших родителей 89e4fcb0dd.Запрос несуществующего четвертого родителя приводит к ошибке.
Если вы хотите извлечь только родителей, используйте красивый формат
%P
для полных хэшейили
%p
для сокращенных родителей.источник
^^^^^^^
вместо~7
, это? Вот почему~
полезноРазница между
HEAD^
иHEAD~
хорошо описана иллюстрацией (Джон Лоулигер), найденной на http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html .Эта документация может быть немного неясной для начинающих, поэтому я воспроизвел эту иллюстрацию ниже:
источник
F = A^2^
.^ == ^1 == LEFTMOST PARENT
,^2 == SECOND LEFTMOST PARENT
и так далее. И~ == ~1 == LEFTMOST PARENT
,~2 == LEFTMOST PARENTS LEFTMOST PARENT == LEFTMOST GRANDPARENT
. По расширению,~2^2 == LEFTMOST GRANDPARENTS SECOND LEFTMOST PARENT
И то,
~
и другое^
ссылается на родителя коммита (~~
и^^
оба ссылаются на коммит деда и т. Д.) Но они различаются по значению, когда используются с числами:~2
означает два уровня в иерархии , через первого родителя, если коммит имеет более одного родителя^2
означает второго родителя, где коммит имеет более одного родителя (т. е. потому что это слияние)Они могут быть объединены, так что
HEAD~2^3
означаетHEAD
третий родительский коммит.источник
^^
было то же самое,^2
но это не так.Мои два цента...
источник
H=A~2^2
нетH=A~2^1
?A
,B
,D
,G
находятся на одной и той же отрасли и фиксацииD
является слияниеG
иH
, следовательно , наличие двух родителей. Таким образом, commit (H
) из другой ветки является ссылкой^2
.Вот очень хорошее объяснение, взятое дословно с http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde :
источник
^<n>
Формат позволяет выбрать п - ю родителя коммита (соответствующий в слияниях).~<n>
Формат позволяет выбрать NTH предок фиксации, всегда после первого родителя. Посмотрите документацию git-rev-parse для некоторых примеров.источник
Стоит отметить, что в git также есть синтаксис для отслеживания «откуда ты пришел» / «хочу вернуться назад» - например,
HEAD@{1}
будет ссылаться на то место, откуда ты перешел на новое место для фиксации.В основном
HEAD@{}
переменные фиксируют историю движения HEAD, и вы можете решить использовать конкретную голову, изучив повторные журналы команды gitgit reflog
.Пример:
Примером может быть то, что я выполнил локальные коммиты a-> b-> c-> d, а затем вернулся к отмене 2 коммитов, чтобы проверить мой код -
git reset HEAD~2
- а затем я хочу переместить свою HEAD обратно в d -git reset HEAD@{1}
.источник
Упрощенно :
~
указывает на предков^
указывает на родителейВы можете указать одну или несколько веток при объединении. Тогда в коммите есть два или более родителей, и тогда
^
полезно указать родителей.Предположим , что вы на ветви А и у вас есть еще две ветви: B и C .
На каждой ветке три последних коммита:
Если сейчас на ветке А вы выполняете команду:
затем вы объединяете три ветви (здесь у вашего коммита слияния три родителя)
а также
~
указывает на n-го предка в первой ветви, поэтомуHEAD~
указывает на А3HEAD~2
указывает на А2HEAD~3
указывает А1^
указывает на n-го родителя, такHEAD^
указывает на А3HEAD^2
указывает на B3HEAD^3
указывает на C3Следующее использование
~
или^
рядом друг с другом происходит в контексте фиксации, обозначенной предыдущими символами.Обратите внимание 1 :
HEAD~3
всегда равно:HEAD~~~
и:HEAD^^^
(каждый обозначает А1 ),и вообще :
HEAD~n
всегда равно:HEAD~...~
( n раз~
) и:HEAD^...^
( n раз^
).Примечание 2 :
HEAD^3
это не то же самое,HEAD^^^
(первый указывает , С3 , а второй обозначает А1 ),и вообще :
HEAD^1
так же, какHEAD^
,HEAD^n
всегда не то же самое, чтоHEAD^...^
( n раз~
).источник
TLDR
~ это то, что вы хотите большую часть времени, оно ссылается на прошлые коммиты на текущую ветку
^ ссылается на родителей (git-merge создает второго или более родителей)
A ~ всегда то же самое, что A ^
A ~~ всегда то же самое, что A ^^, и, следовательно,
A ~ 2 не то же самое, что A ^ 2,
потому что ~ 2 является сокращением для ~~,
а ^ 2 не сокращение для чего-либо, это означает, что 2-й родитель
источник
HEAD ^^^ такой же, как HEAD ~ 3, выбирая третий коммит перед HEAD
HEAD ^ 2 указывает второй заголовок в коммите слияния
источник
HEAD ~ указывает первого родителя на "ветке"
HEAD ^ позволяет выбрать конкретного родителя коммита
Пример:
Если вы хотите следовать боковой ветви, вы должны указать что-то вроде
источник
фактический пример разницы между HEAD ~ и HEAD ^
источник
Проще говоря, для первого уровня происхождения (происхождение, наследование, происхождение и т. Д.) HEAD ^ и HEAD ~ оба указывают на один и тот же коммит, который (расположен) на одного родителя выше HEAD (коммит).
Кроме того, ГОЛОВА ^ = ГОЛОВА ^ 1 = ГОЛОВА ~ = ГОЛОВА ~ 1. Но ГОЛОВА ^^! = ГОЛОВА ^ 2! = ГОЛОВА ~ 2. Еще ГОЛОВА ^^ = ГОЛОВА ~ 2. Читать дальше.
Помимо первого уровня происхождения, все становится сложнее, особенно если с рабочей веткой / главной ветвью произошли слияния (из других ветвей). Существует также вопрос синтаксиса с кареткой, HEAD ^^ = HEAD ~ 2 (они эквивалентны), НО HEAD ^^! = HEAD ^ 2 (это совершенно разные вещи).
Каждый / символ каретки относится к первому родителю HEAD, поэтому знаки, объединенные в строку, эквивалентны выражениям тильды, потому что они относятся к первым родителям первого родителя (первого родителя) и т. Д., И т. Д. И т. Д., Строго основываясь на количестве подключенных карет или на число после тильды (так или иначе, они оба означают одно и то же), то есть остаются с первым родителем и идут вверх на x поколений.
HEAD ~ 2 (или HEAD ^^) относится к коммиту, который является двумя уровнями происхождения выше / выше текущего коммита (HEAD) в иерархии, что означает коммит деда и дедушки HEAD.
HEAD ^ 2, с другой стороны, ссылается не на коммит второго родителя первого родителя, а просто на коммит второго родителя. Это связано с тем, что символ каретки означает родителя коммита, а следующий за ним номер указывает, на какой / какой родительский коммит ссылается (первый родитель в случае, когда за кареткой не следует число [потому что это сокращение для номера). будучи 1, означая первого родителя]). В отличие от каретки, число, которое следует после, не подразумевает другого уровня иерархии вверх, а скорее означает, сколько уровней вбок, в иерархии, нужно найти правильного родителя (commit). В отличие от числа в выражении тильды, это только один родительский элемент в иерархии, независимо от числа (непосредственно), идущего за кареткой. Вместо того, чтобы вверх, карет
Таким образом, HEAD ^ 3 равен третьему родителю коммита HEAD (НЕ пра-пра-прародитель, который будет HEAD ^^^ AND HEAD ~ 3 ...).
источник
~
это значит родитель.^
если у него есть два или более родителей, например, коммит слияния, мы можем выбрать второго из родителей или другого.так что если только одна вещь, как (HEAD ~ или HEAD ^), она имеет те же результаты.
источник