Подтвердить что ты не робот

Как заставить общий предок в слиянии git?

Скажем, у меня есть ветвь с именем master и ветвь с именем upstream_lib.

В ветки master имеется подкаталог lib, основанный на коде, который находится на ветке upstream_lib; изменения в upstream_lib периодически объединяются (с стратегией поддерева) в ветвь master. Каталог lib в master имеет свои собственные модификации, которые не находятся в upstream_lib.

Однако скажем, что две ветки либо не имеют общей истории (поскольку репозиторий был просто перенесен на git, например), либо база слияния некорректна, потому что слияния в upstream_lib были сжаты, какой-то перегиб или что-то еще.

Вопрос: задан новый набор изменений на upstream_lib, как заставить слияние рассматривать в качестве общего предка конкретную ревизию upstream_lib?

4b9b3361

Ответ 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.