Ответ 1
Я никогда не использовал стратегию subtree
, поэтому, возможно, это субоптимальное решение (и, возможно, это не сработает ^^), но вы можете применить все новые коммиты в upstream_lib
к временной ветке строки master
, а затем слить это. То, что я имею в виду, не в корне не исправляет вашу ситуацию, поэтому вам придется делать такой "ручной слияние" каждый раз, когда вы хотите вносить новые изменения, но вот как это работает:
- Определите поддельного общего предка в родословной
master
, скажемmaster~100
. - Определите поддельного общего предка в строке
upstream_lib
, скажемupstream_lib~150
. - Сделайте выделенную копию ветки
upstream_lib
:git branch --no-track new_upstream_lib upstream_lib
-
Перебазируйте
new_upstream_lib
наmaster~100
, используя рекурсивную стратегию с опцией поддерева. (Я не думаю, что вы можете просто использовать стратегию поддерева, потому что, как вы говорите, каталогlib
вmaster
имеет свои собственные изменения.) Здесь для этой цели используется непроверенная команда:git rebase -s recursive -X subtree=lib --onto master~100 upstream_lib~150 new_upstream_lib
Обратите внимание, что
new_upstream_lib
теперь имеет в нем все деревоmaster
, хотя вам остается только каталогlib
. - Объединить его:
git checkout master && git merge new_upstream_lib && git branch -d new_upstream_lib
.