Как заставить общего предка в git merge? - PullRequest
17 голосов
/ 12 января 2011

Допустим, у меня есть ветвь с именем master и ветвь с именем upstream_lib.

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

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

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

1 Ответ

10 голосов
/ 13 января 2011

Я никогда не использовал стратегию subtree, поэтому, возможно, это неоптимальное решение (и, возможно, оно не будет работать ^^), но вы можете применить все новые коммиты в upstream_lib к временному переходулинии master, а затем объединить это.То, что я имею в виду, принципиально не исправляет вашу ситуацию, поэтому вам придется выполнять такое «ручное слияние» каждый раз, когда вы хотите внести новые изменения, но вот как это работает:

  1. Определите поддельного общего предка в линии master, скажем master~100.
  2. Определите поддельного общего предка в линии upstream_lib, скажем upstream_lib~150.
  3. Makeодноразовая копия ветви upstream_lib: git branch --no-track new_upstream_lib upstream_lib
  4. Перебазировка 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.

  5. Объедините его: git checkout master && git merge new_upstream_lib && git branch -d new_upstream_lib.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...