Git: Слияние и Подмодули - PullRequest
       20

Git: Слияние и Подмодули

10 голосов
/ 07 декабря 2010

Допустим, у меня есть две ветви в RepoX, которые называются BranchA и BranchB. RepoX также имеет подмодуль под названием SubmoduleY.

В BranchA имеется субмодуль Y в редакции 'abc', в BranchB есть субмодуль Y в редакции 'def'.

Скажем, я хочу объединить BranchA с BranchB, но я хочу оставить SubmoduleY BranchB, указывающий на его первоначальную версию 'def'. Я вижу несколько способов сделать это:

Метод 1:

  1. Оформить заказ BranchB.
  2. Переместите SubmoduleY в ревизию 'abc', чтобы сделать фактическое слияние безболезненным (сейчас мы не хотим выполнять слияние на уровне подмодуля).
  3. Зафиксируйте новую ревизию для SubmoduleY (у нас не может быть плавающей для слияния).
  4. Объединить BranchA в BranchB. Разрешите любые конфликты.
  5. Переместить SubmoduleY обратно в ревизию 'def'.
  6. Зафиксируйте новую версию для SubmoduleY.
  7. Нажмите изменения до основного репо.

Метод 2:

То же, что и в методе 1, но вместо выполнения шага 6 выполните перебазирование и избавьтесь от дополнительной фиксации подмодуля, начиная с шага 3.

Кажется, у обоих есть досадные недостатки:

Метод 1 помещает в историю два дополнительных коммита.

Метод 2 забывает любые изменения, связанные с ревизиями подмодуля, потому что эти коммиты удаляются. Поэтому при любом последующем слиянии придется снова решать некоторые проблемы.

Есть ли лучший способ?

1 Ответ

7 голосов
/ 08 декабря 2010

Вы можете сделать вариант для вашего метода 1, но выполнить коммит, который вводит изменение в версию подмодуля (на вашем шаге 6), с помощью --amend, чтобы он изменил состояние подмодуля в коммите слияния.Другими словами, это будет:

$ git checkout b
$ git merge a
Merge made by recursive.
 example.txt |    1 +
 sY          |    2 +-
 2 files changed, 2 insertions(+), 1 deletions(-)
 create mode 100644 example.txt
$ cd sY
$ git checkout def
[... you get the "detached HEAD" warning ...]
$ cd ..
$ git add sY
$ git commit --amend

Обратите внимание, что я не пытался избежать подмодулей в разных версиях перед объединением, как вы предложили в своем вопросе.Если есть конфликт, вы можете просто добавить подмодуль на def, чтобы разрешить его.Если нет конфликта, шаги, которые я упомянул выше, должны работать нормально.

...