В чем разница между РУКОВОДИТЕЛЕМ ^ и ГОЛОВАМИ ~ в Git?

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
...

Таким образом, вы должны быть в состоянии ссылаться на какой-либо фиксации в истории вашего хранилища.

 

рекомендация

отwww.cnblogs.com/chucklu/p/11120082.html