Git ветвь тестирования слияния (окончательная фиксация) для ветвления
Я создал ветку тестирования. У этого есть много крошечных коммитов, чтобы построить одну особенность.
В конце этого я хочу принять окончательные завершенные изменения и поместить их в главную ветку.
Мастер-ветвь не должна содержать историю ветки тестирования.
В конечном итоге ветка тестирования будет удалена.
Каков наилучший способ достичь этого?
Будет ли генерация патча и применение его на мастер лучше всего?
Если да, как мне создать/применить патч?
Ответы
Ответ 1
Различные подходы описаны в разделе Понимание Git Workflow":
Краткосрочная работа
Подавляющее большинство времени, моя очистка - это просто слияние сквоша.
git checkout master
git merge --squash private_feature_branch
git commit -v
Большая работа
Я решил, что мое изменение должно быть разбито на более мелкие изменения, поэтому сквош слишком тупой инструмент. (Как правило, я спрашиваю: "Было бы легко проверить код?" )
git rebase --interactive master
(не вариант в вашем случае, как вы упомянули в своем вопросе)
Объявление банкротства ветки
Возможно, моя ветка функций существовала очень долго, и мне пришлось объединить несколько ветвей в мою ветку функций, чтобы поддерживать ее в актуальном состоянии, пока я работаю. История запутана. Его проще всего захватить необработанный diff создать чистую ветвь.
git checkout master
git checkout -b cleaned_up_branch
git merge --squash private_feature_branch
git reset
Теперь у меня есть рабочий каталог, полный моих изменений, и ни один багаж из предыдущего ветки. Теперь я вручную добавляю и фиксирую свои изменения.
Ответ 2
Вы ищете --squash
вариант git merge
:
- squash --no-squash
Создайте рабочее дерево и состояние индекса, как если бы произошло реальное слияние (за исключением информации о слиянии), но на самом деле не делают фиксацию или переместите HEAD, и не запишите $GIT_DIR/MERGE_HEAD, чтобы вызвать следующий gitcommit для создания слияния. Это позволяет создать single commit поверх текущей ветки, эффект которой такой же, как и слияние другой ветки (или больше в случае осьминогов).
С помощью -no-squash выполните слияние и зафиксируйте результат. Этот параметр может использоваться для переопределения --squash.
Итак git merge --squash test-branch
и завершите.
Вы также можете попробовать git merge --no-commit --no-ff test-branch
Ответ 3
git checkout master
git merge --squash testing-branch
То, что --squash
поместит ваш рабочий набор в состояние, как если бы все изменения в ветке тестирования были объединены с мастером, но не создавали никаких коммитов. Затем вы можете сделать git commit
, и все изменения войдут в одну фиксацию.