Объединение коммитов слияния

Этот вопрос очень связан с git rebaseinteractive: слияние сквоша выполняется вместе .

Предположим, вы пишете новую функцию для определенного проекта. Вы начинаете с определенной ветки, скажем, devel, и создаете ветку для своей функции, feature/X. Время от времени вы также находите некоторые проблемы в проекте, поэтому вы решаете построить вторую ветку, называемую fixes, начиная с devel.

Поскольку вам нужно применять исправления по ходу feature/X, вы продолжаете делать git merge fixes время от времени, так что в итоге вы окажетесь в следующей ситуации:

      a --- b --- M --- c --- M --- d ---- e --- M (feature)
     /           /           /                  /
    /           /           /                  /
devel ----- fix1 ------ fix2 ------------- fix3 (fixes)

Поскольку это никогда не нажималось (поэтому я не нарушаю чью-либо историю), я хотел бы объединить все слияния в одно, получив следующее:

      a ---------------------- M --- b --- c --- d --- e (feature)
     /                        /
    /                        /
devel -- fix1 -- fix2 -- fix3 (fixes)

Способ получения этого результата будет

git co -b feature2 devel
git merge --no-ff fixes
git rebase featur2 feature

Это на самом деле делает работу, но заставляет меня создать дополнительную ветку feature2, которая позже появится в сообщении коммита слияния. Кроме того, попробуйте сделать это, когда вы работаете более чем с двумя ветками!

Есть ли более элегантный способ сделать это? Кажется, операция стоит удобной команды, поэтому я предполагаю, что есть какой-то ярлык.

Спасибо за вашу помощь


person Dacav    schedule 05.10.2013    source источник


Ответы (2)


Вероятно, вы захотите использовать параметр --preserve-merges для git rebase --interactive, переупорядочить коммиты так, чтобы слияния были первыми, а затем объединить все слияния вместе. Если бы я был на вашем месте, я бы сделал две перебазировки, одну для изменения порядка, а другую для раздавливания, чтобы было проще разрешать конфликты.

Однако ваше решение с использованием «feature2» кажется достаточно хорошим, вы можете отредактировать сообщение фиксации слияния, поэтому имя «feature2» не является проблемой, а также вам не нужно создавать ветку, вы можете работать на отдельном глава:

git checkout devel^0
git merge --no-ff --edit fixes
git rebase HEAD feature
person FelipeC    schedule 06.10.2013
comment
Мне не хватает синтаксиса devel^0. Разве это не должно быть просто devel? - person Dacav; 06.10.2013
comment
Если вы используете devel, вы будете в этой ветке, если вы используете devel^0, вы не будете, вместо этого вы будете на отдельной HEAD. Если вы находитесь на devel, то вы будете сливаться с этой веткой, но если вы находитесь в отдельной HEAD, вы не будете сливаться ни с одной веткой. - person FelipeC; 06.10.2013

Если можно жить с немного другой историей, а именно

                               + --- a' --- b' --- c' --- d' --- e' (feature)
                              /
                             /
devel -- fix1 -- fix2 -- fix3 (fixes)

тогда вы можете сделать это в одной команде.

$ git rebase fixes feature

Есть ли что-то особенное в вашей истории, из-за чего вы хотите сохранить родительские ссылки из коммитов слияния в feature, когда эта родословная уже присутствует в fixes?

person Greg Bacon    schedule 06.10.2013
comment
С точки зрения источника действительно то же самое. Просто мне нравится иметь четкое представление о развитии истории. В любом случае ваше решение сработает, так что +1. - person Dacav; 06.10.2013