Разница немного вертикальная и горизонтальная.
В Git коммиты являются типом связанного списка, каждый коммит имеет ссылку на родительский коммит или несколько родительских коммитов..
Доступ к родителю или прародителю осуществляется с помощью ~
:
~
является прямым родителем коммита, ~2
(или ~~
) является прародителем - и т. Д.
Это вертикальная сторона, если вы посмотрите на журнал, используя ~
заставит вас пройти через коммиты.
Теперь, когда вы объединяете две ветви, он делает коммит слияния.Коммит слияния по определению объединяет две или более ветвей.Таким образом, коммит слияния будет иметь двух или более родителей.
Из коммита слияния, если вы хотите получить доступ к разным родителям, вы используете ^
(на самом деле это похоже на слияние двух ветвей).
Итак, рассмотрим эту часть журнала:
* 39a2f899 (HEAD)
|\
| * e2e7d241 (BRANCH)
| * caf13dc1
| * 609a9715
|/
* 663e09ff
Если вы хотите получить доступ к родительскому коммиту BRANCH
, вы должны сделать BRANCH~
или e2e7d241~
, что даст caf13dc1
.Теперь, если вы хотите получить доступ к родителю HEAD
и выполнить HEAD~
, он выдаст вам 663e09ff
(фиксация перед началом ветки).
Но если вы хотите получить доступ к цепочке коммитов объединенной ветви, то здесь в игру входит ^
, вы должны сделать HEAD^2
, чтобы сказать «второй родитель HEAD» (неродительский родитель).
Конечно, вы можете объединить их, на том же графике, HEAD^2~
является родителем (~
) второго родителя (^2
) HEAD, то есть caf13dc1
Кстати, у каждого коммита есть хотя бы 1 родительский элемент, поэтому commit^
всегда совпадает с commit~
.С другой стороны, если коммит имеет одного родителя (это не коммит слияния), commit^2
выдаст ошибку.
Подводя итог, вы получаете доступ к разным родителям слияния с помощью ^
и вы получаете доступ к поколениям коммитов с помощью ~
.
Это может быть проиллюстрировано следующим образом с более сложным слиянием (из 4 слитых веток одновременно):
----------> use ^ to go through the parents of the merge
|
| *-----. 6af2936d
| |\ \ \ \
| | | | | * 20d6fb23 BRANCH1
| | | | * | e589d446 BRANCH2
| | | | * | ec6088bd
| | | | |/
| | | * | 38dcecfa BRANCH3
| | | |/
| | * | 698c3daa BRANCH4
| | |/
| |/
| * 2d97958e
| |\
| | * 8989f1d3
| | * d907cb7a
| |/
| * af368002
V
use ~ to go this way (through the ancestors)