Перебазирование беспорядка смешанных ветвей

После вопроса об этом создание патча в git вызывает некоторые головные боли и узнав, как использовать rebase в первый раз, я понял, что должен был использовать его и для некоторых других вещей.

Есть вышестоящий репозиторий, который я клонировал. Я сделал некоторые из своих собственных конфигураций тестирования и отладки, которые я не планирую когда-либо продвигать. Когда вышестоящий репозиторий обновлялся, я всегда сливал изменения в свою «тестирующую» ветку. Теперь я понимаю, что перебазирование моей тестовой ветки на новейшие коммиты в восходящем потоке/мастере сделало бы мой репозиторий намного чище.

Я попытался перебазировать свою тестовую ветку на новейшую фиксацию на мастере, но у нее возник ряд конфликтов слияния - и, похоже, нужно переписать много коммитов. Будет головной болью, если во многих из них возникнут конфликты слияния.

Есть ли способ просто взять «состояние» тестовой ветки и «состояние» основной ветки и переписать новый коммит, возможно, в ветку «testing2», которая имеет все различия?


person GolDDranks    schedule 16.10.2014    source источник
comment
Будет ли работать git checkout master; git merge --squash testing?   -  person knittl    schedule 16.10.2014
comment
Вау, это действительно было! У него все еще есть некоторые конфликты слияния (неизбежно, поскольку есть конфликтующие вещи), но теперь они все в одном, раздавленном коммите, и поэтому их легко уладить!   -  person GolDDranks    schedule 16.10.2014


Ответы (2)


Чтобы ответить на ваш последний абзац:

Есть ли способ просто взять «состояние» тестовой ветки и «состояние» основной ветки и переписать новый коммит, возможно, в ветку «testing2», которая имеет все различия?

Есть. git merge --squash branch выполнит слияние и поместит все изменения в один коммит. Вы потеряете всю информацию о фиксации, включая историю и информацию о слиянии, поэтому обязательно осознайте последствия. Кроме того, единичные огромные коммиты редко бывают полезными.

Использование git rebase также должно работать, если обе ветки имеют общего предка. Git достаточно умен, чтобы выяснить, какие коммиты уже содержатся в мастере, а какие нет, и соответственно линеаризует вашу историю.

person knittl    schedule 16.10.2014
comment
На этот раз git merge --squash branch был как раз тем, что я хотел сделать. Спасибо. - person GolDDranks; 16.10.2014

Не видя различий в коммитах, я бы рекомендовал выбирать вишни. Создайте новую ветку из самой свежей upstream/master, а затем выберите (git cherry-pick <hash>) коммиты, которые вы сделали в своей собственной ветке.

person helion3    schedule 16.10.2014