2013-10-05 2 views
1

Этот вопрос очень важен для git rebase interactive: squash merge commits together.Плавление вместе слияния коммитов

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

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

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

ответ

1

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

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

git checkout devel^0 
git merge --no-ff --edit fixes 
git rebase HEAD feature 
+0

Я пропустил синтаксис 'devel^0'. Разве это не должно быть просто «девелом»? – Dacav

+1

Если вы используете 'devel', вы попадете на эту ветку, если вы используете' devel^0', вы не будете, вместо этого вы будете на отдельной головке. Если вы находитесь на 'devel', тогда вы будете сливаться с этой ветвью, но если вы находитесь в отдельно стоящей HEAD, вы будете сливаться без ветки. – FelipeC

1

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

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

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

$ git rebase fixes feature

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

+0

С точки зрения источника действительно то же самое. Мне просто нравится иметь четкое представление об истории развития. В любом случае ваше решение будет работать, поэтому +1. – Dacav

Смежные вопросы