Стоит отметить, что независимо от того, как вы делаете это, вы получаете не вставленный коммит.
Если вы сделаете ребазинг - как бы вы его ни делали - вместо этого вы получите новую ветку , заканчивающуюся новым коммитом. Новая ветвь может повторно использовать имя старой ветки (что приводит к очевидному вопросу: Что именно мы подразумеваем под "ветвью"? ), но ваша новая цепочка фиксации будет иметь новые и другие хэш-идентификаторы из вашей исходной цепочки коммитов.
То есть, если у вас было:
... <-c1000a <-c1001a <-- master
потому что ваша система думала, что c1001
должен прийти сразу после c1000
, и теперь стало понятно, что нет, между ними должен быть коммит, вы можете сделать новый c1001b
:
... <-c1000a <-c1001a <-- master
\
c1001b
но теперь вы должны скопировать то, что было c1001a
в c1002b
:
... <-c1000a <-c1001a <-- master
\
c1001b <- c1002b
Теперь вы можете иметь имя master
, указывающее на c1002b
, "забывая" c1001a
полностью:
... <-c1000a <-c1001a
\
c1001b <- c1002b <-- master
Забытый коммит продолжает существовать (и быть действительным) до тех пор, пока Git где-то запоминает свой хэш-идентификатор (обычно в записи reflog , в течение 30+ дней, за исключением серверов репозитория --bare
). где нет льготного периода). Если какой-то другой Git захватил c1001a
, то другой Git сохранит его и может объединить его с c1002b
- или каким бы ни был последний совет master
- позже, так как , если они оба были названы master
, вы, вероятно, захотите объединить c1001a
. (Вы действительно не знаете, но Git не знает этого.)
Если вы сливаетесь, вы просто получаете коммит слияния в конце. Вы добавляете коммит в новую временную ветку:
c1001a <-- master
/
... <-c1000a
\
c1001b <-- temporary
, а затем git checkout master; git merge -s ours temporary
, чтобы сохранить исходное дерево из c1001a
:
c1001a
/ \
... <-c1000a c1002a <-- master
\ /
c1001b <-- temporary
Стирание временного имени дает вам окончательный результат:
c1001a
/ \
... <-c1000a c1002a <-- master
\ /
c1001b
, который не даст другим репозиториям Git никакой изжоги, поскольку вы не сознательно выбросили плохой коммит в пользу новой и улучшенной версии (которую другой Git может затем вернуть) , Вместо этого вы просто добавили коммитов, которые все Гиты понимают как другие Гиты в любое время.
Недостатком метода слияния является то, что, возможно, это неправильная история.