Я проголосовал за ответ Скотта Велдона, что правильно, но я просто хочу добавить попытку рисования ASCII, включающего родительский нумерация. Дан график, который выглядит следующим образом:
B
/ \
...--A D--...
\ /
C
мы можем сказать, что узел D
является фиксацией слияния, но мы не можем сказать, является ли узел B
или C
первым родителем узла D
. Один из двух обязательно является первым родителем, а другой - вторым. Поэтому, если нам нужно знать, мы должны пометить рисунок, что занимает больше места. Вот одна из таких попыток.
B
/ \²
...--A D--...
\ /¹
C
Теперь мы видим, что по какой-то причине1 я нарисовал график «вверх ногами»: этот коммит C
на самом деле является первым родителем D
, а коммит B
— вторым родителем.
Можно создавать произвольные слияния с помощью команд более низкого уровня («сантехника»). В частности, git commit-tree
просто принимает столько -p
аргументов, сколько вы хотите ему передать, в том порядке, в котором вы их даете, и создает новую фиксацию с данными фиксациями в качестве родительских. Дайте ему один -p
, и он сделает обычную фиксацию с одним родителем. Не дайте ему -p
аргументов, и он сделает корневую фиксацию. Дайте ему 155 различных -p
аргументов (все должны, конечно, разрешаться в действительные идентификаторы коммитов), и он сделает один массовый коммит слияния осьминога.
Однако команда git merge
всегда делает новую фиксацию с первым родителем, являющимся текущим HEAD
(отсюда и текущая ветвь, если она находится на ветке). Второй родитель для стандартного слияния с двумя родителями происходит от .git/MERGE_HEAD
, в который git merge
записывает другой идентификатор коммита. Если слияние конфликтует или окончательная фиксация слияния задерживается на --no-commit
, этот MERGE_HEAD
файл фактически является единственным местом, где доступен идентификатор фиксации.
(Когда git merge
выполняет слияние осьминога, используя стратегию -s octopus
— эта стратегия принудительно используется для таких слияний — и несколько дополнительных родителей, она прерывается и вообще не оставляет следов, если есть конфликты слияния, поэтому случай конфликта никогда не возникает. У меня есть не пробовал комбинировать --no-commit
со слиянием осьминога, но это, по логике, оставило бы родителей со 2-го по N-й в MERGE_HEAD
, если Git вообще это позволяет.)
1Упрямство.
person
torek
schedule
21.10.2016
C'
были родителиZ
иB'
? Зачем вам выбиратьC
, если вы уже выбралиB
? - person Scott Weldon   schedule 20.10.2016A -- Z -- B' -- C'
(еслиC'
проще иметь несколько родителей, это тоже работает). Мне нужно выбрать эту фиксацию для информации об авторе, несмотря на то, что она пуста - person rink.attendant.6   schedule 21.10.2016-m 1
, но на самом деле не раскрывает в чем разница я>. Я думаю, было бы очень полезно расширить ваш второй вопрос и, возможно, показать различия между 1-м и 2-м родителем. - person rink.attendant.6   schedule 21.10.2016