Что за логическая разница между родителем и предком? - PullRequest
3 голосов
/ 10 апреля 2019

Я знаю, что могу найти десятки вопросов о разнице между HEAD^ и HEAD~

  • ~ указывает ancestors
  • ^ указывает parents

Мой вопрос о разнице значений parents и ancestors.для меня родитель - это то же самое, что и предок.

В чем логическая разница между родителем и предком?

В чем разница между HEAD ^ и HEAD ~ в Git? не отвечайте на мой вопрос, мой вопрос о логическом значении двух терминов.

Ответы [ 2 ]

4 голосов
/ 10 апреля 2019

Разница немного вертикальная и горизонтальная.

В 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)
2 голосов
/ 10 апреля 2019

Короче говоря

«родители» означают только прямых родителей, то есть коммитов, чей SHA-1 явно указан в определении данного коммита.

«предки» относятся к родителям комита и их родителям , рекурсивно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...