2010-12-07 4 views
8

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

BranchA имеет SubmoduleY при пересмотре 'abc', BranchB имеет SubmoduleY в редакции 'def'.

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

Метод 1:

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

Метод 2:

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

И, кажется, есть раздражающие недостатки:

Способ 1 ставит в историю два дополнительных фиксации.

Способ 2 забывает о любых изменениях, связанных с изменениями подмодуля, поскольку эти фиксации удаляются. Следовательно, любые слияния позже должны будут снова решить некоторые проблемы.

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

ответ

7

Вы можете сделать вариацию в методе 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, чтобы решить проблему. Если конфликт не существует, шаги, упомянутые выше, должны работать нормально.

+0

Отличное решение! Благодарю. – Ben 2010-12-08 17:56:01