https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git
Эмпирические правила
- Используйте
~
большую часть времени - вернуться несколько поколений, как правило , то , что вы хотите - Использование
^
на слиянии совершает - потому что у них есть два или более (немедленные) родители
Мнемоника:
- Тильда
~
почти линейна по внешнему виду , и хочет , чтобы идти назад по прямой линии - Caret
^
предлагает интересный сегмент дерева или вилку в дороге
тильда
Раздел «Задание Ревизии» в git rev-parse
документации определяет , ~
как
<rev>~<n>
, Напримерmaster~3
, суффикс~<n>
для параметра пересмотра означает объект коммит , который является п - го поколения предка по имени объекта фиксации, после только первых родителей. [Например,]<rev>~3
эквивалентно<rev>^^^
, что эквивалентно<rev>^1^1^1
...
Вы можете добраться до родителей любого совершить, не просто HEAD
. Вы также можете вернуться назад через поколение: к примеру, master~2
означает прародитель наконечника главного отделения, в пользу первого родителя на слияние совершает.
знак вставки
Гит история нелинейна: ориентированный ациклический граф (DAG) или дерево. Для фиксации только с одним родителем, rev~
и rev^
означает то же самое. Селектор каретки становится полезным при слиянии совершает , потому что каждый из них является потомок двух или более родителей - и напрягает язык заимствованный из биологии.
HEAD^
означает , что первый непосредственный родитель кончике текущей ветви. HEAD^
является аббревиатурой HEAD^1
, и вы можете также обратиться HEAD^2
и так далее в зависимости от обстоятельств. Же раздел git rev-parse
документации определяет его как
<rev>^
, НапримерHEAD^
,v1.5.1^0
суффикс^
к параметру пересмотра означает первый родитель этого объекта фиксации.^<n>
означает п - го родителя ([ например , ]<rev>^
эквивалентно<rev>^1
). В качестве специального правила,<rev>^0
значит , взять на себя обязательство и используется , когда<rev>
это имя объекта объекта тега , который относится к фиксации объекта.
http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde
Я потратил немного времени, играя с Git сегодня, а именно так, что ^ (каре) и ~ (тильда) работы и думал, что документ, он здесь, в случае, если я забываю.
Короткая версия
Если вы хотите глубже объяснение переходите к «длинной версии».
ref~
представляет собой сокращенное ref~1
и средство фиксации первого родителя. ref~2
означает , что совершение ого первый родителя первого родителя . ref~3
означает , что совершение ых первый родитель первого родителя первого родителя в в . И так далее.
ref^
представляет собой сокращенное ref^1
и средство фиксации первого родителя. Но там , где два отличаются, что ref^2
означает фиксацию ого второго родителя (помните, совершает может иметь два родителей , когда они слияние).
^ И ~ операторы могут быть объединены.
Вот диаграмма, показывающая, как ссылаться на различные фиксации, используя ГОЛОВА в качестве отправной точки.
ГОЛОВА ~ 1 ^ 2 совершают 的 первого родителя 的 второго родителя
Длинная версия
Я создал фиктивный репозиторий с несколькими фиксациями в нем.
$ git log --graph --oneline
* 8329384 Seventh commit
* f5717b0 Merge branch 'my_branch'
|\
| * 956c87d Fourth commit on a branch
* | a8fe411 Sixth commit
|/
* c7c2590 Third commit on a branch
* 86362ff Second commit on a branch
* 748855b First commit on a branch
* 1855b25 Fifth commit
* 67cf3a7 Fourth commit
* ea29778 Third commit
* 28c25b1 Second commit
* cd00b76 First commit
Начиная снизу, ранние коммиты были сделаны прямо на хозяина.
Коммиты , начиная с 748855b
и двигающимся до c7c2590
были сделаны на ветке и слиты в мастер, но никаких изменений не были сделаны на мастере в то же время.
Совершающее a8fe411
и 956c87d
были сделаны на отдельных ветвях одновременно. Они были объединены вместе совершить f5717b0
.
Наконец, 8329384
было совершено прямо на хозяина.
Мы можем использовать , git show
чтобы посмотреть на отдельных фиксаций.
Вы уже знаете , что HEAD
указывает на кончике текущей ветви:
$ git show --oneline HEAD
8329384 Seventh commit
Ввод символа вставки (^) рядом с коммитом означает , что родитель совершает. Таким образом, появится следующее окно родителя HEAD
:
$ git show --oneline HEAD^
f5717b0 Merge branch 'my_branch'
...
HEAD^
представляет собой сокращенное говоря HEAD^1
, что буквально означает показать мне родитель 1 из этой фиксации. Можно также сказать , HEAD^2
но в данном случае это не имеет никакого смысла:
$ git show --oneline HEAD^2
fatal: ambiguous argument 'HEAD^2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Потому что HEAD
только 1 из родителей.
Но f5717b0
, точка , в которой были объединены две ветви, два родителя, один на мастер и один на отрасли:
$ git show --oneline f5717b0^1
a8fe411 Sixth commit
...
$ git show --oneline f5717b0^2
956c87d Fourth commit on a branch
...
Тильды (~) работает аналогичным образом. На самом деле HEAD~
будет ссылаться на то передай , как HEAD^
:
Опять же , HEAD~
это сокращение HEAD~1
, но здесь это означает , что первый предок HEAD
- HEAD~2
это не второй родитель , HEAD
но прародитель HEAD
:
$ git show --oneline HEAD~1
f5717b0 Merge branch 'my_branch'
...
$ git show --oneline HEAD~2
a8fe411 Sixth commit
...
$ git show --oneline HEAD~3
c7c2590 Third commit on a branch
Как вы можете видеть, 956c87d Fourth commit on a branch
не видно при использовании тильды оператора. Это происходит потому , что Тильда оператор всегда предполагает , что вы хотите просмотреть родитель первого родителя.
Для доступа второго родителя родителя тильда и каретка символы могут быть объединены:
$ git show --oneline HEAD~1^1
a8fe411 Sixth commit
...
$ git show --oneline HEAD~1^2
956c87d Fourth commit on a branch
...
Таким образом, вы должны быть в состоянии ссылаться на какой-либо фиксации в истории вашего хранилища.