На самом деле это довольно просто, но команды не обязательно очевидны.Хорошая альтернатива, если вам понадобится добавить больше обновлений из B, это git-subtree (не путать со стратегией слияния поддерева).Вы говорите, что хотите получить один репозиторий, поэтому использование подмодулей git нецелесообразно.
Вот классический способ сделать это с некоторыми пояснениями:
Перейдите в хранилище A:
cd A
Извлеките ветку master
(или любую другую) из хранилища B
и (временно) сохраните ее как FETCH_HEAD
:
git fetch /home/whoever/dev/B master
Выполните слияние, которое игнорирует изменения с FETCH_HEAD
, но не фиксирует.Это сделано для того, чтобы позднее мы могли зафиксировать слияние, и родители слияния будут включать FETCH_HEAD
.(Этот родитель хранится в .git/MERGE_HEAD
.)
git merge -s ours --no-commit FETCH_HEAD
Считать дерево из FETCH_HEAD
(все еще извлеченной master
ветви B
) в стадиюобласть в подкаталоге src/B
.-u
означает отразить результат этого также в рабочей копии:
git read-tree --prefix=src/B/ -u FETCH_HEAD
Окончательно зафиксировать результат:
git commit -m "Merge in the history of master from B into src/B"
Это похоже на то, что предлагается на странице справки GitHub по стратегии слияния поддерев , за исключением того, что я пропустил создание удаленного для B
.Обратите внимание, что также в этой процедуре фактически не использовалась стратегия слияния поддеревьев - это было бы только для включения дальнейших изменений с B
, если я правильно понимаю.