Мне трудно понять, как эта штука работает в git, кто родитель, а кто дедушка.Кроме того, в чем разница между ^ и ~ в Git.
Первое, что нужно запомнить, это то, что ^
относится только к родителям, а ~
относится к предкам.COMMIT^2
относится ко второму родителю коммита, а COMMIT~2
относится ко второму предку.
Parents
Простой коммит в git имеет только одного родителя, тогда как коммит слиянияесть как минимум два.Итак, в вашем примере commit 796ddb0
имеет двух родителей:
* 9ec05ca (HEAD -> master) Revert "Set page heading to "Quests & Crusades""
* db7e87a Set page heading to "Quests & Crusades"
* 796ddb0 Merge branch 'heading-update'
|\
THIS IS PARENT #2 --> | * 4c9749e (heading-update) Set page heading to "Crusade"
THIS IS PARENT #1 --> * | 0c5975a Set page heading to "Quest"
796ddb0^1
относится к 0c5975a
, потому что мы считаем родителей начиная слева.796ddb0^2
относится к 4c9749e
.
Предки
Предком является любой коммит на пути между указанным коммитом и корнем вашего репозитория, всегда следующий за первым родителем в случае, есликоммит имеет несколько родителей.Поэтому, если бы мы пометили предков HEAD
в первой части вашего примера, мы бы получили:
* 9ec05ca (HEAD -> master) Revert "Set page heading to "Quests & Crusades""
HEAD~1 * db7e87a Set page heading to "Quests & Crusades"
HEAD~2 * 796ddb0 Merge branch 'heading-update'
|\
| * 4c9749e (heading-update) Set page heading to "Crusade"
HEAD~3 * | 0c5975a Set page heading to "Quest"
|/
HEAD~4 * 1a56a81 Merge branch 'sidebar'
Наконец
Мы можем разбить HEAD~4^2
надве операции:
HEAD~4
относится к фиксации 1a56a81
.Это коммит слияния с двумя родителями, поэтому ... 1a56a81^2
относится к f69811c