Как я могу создать дочернюю ветку, которая включает все коммиты из другой ветви в один узел?
У меня есть ветвь, mybranch, которая имеет шесть коммитов и основывается на коммите C. Я хотел бы создать новую ветку, также основанную на коммите C, которая фактически включает все коммиты из mybranch, объединенные в один коммит. Какой самый простой способ сделать это?
Мне нужно сделать это из-за мантры "сквош, прежде чем гит-пуш". Что касается новой ветки, я не хочу, чтобы упоминание mybranch в истории передавалось на удаленный сервер. Причина, по которой я хочу создать совершенно новую ветвь, используемую для push, заключается в том, что я хотел бы сохранить все коммиты в mybranch для справки.
1 ответ
Почему только нажим раздавлен коммитов? Это звучит безумно (и неправильно).
Но чтобы ответить на ваш вопрос:
git checkout -b newbranch # checkout new branch
git reset --soft C # move to commit C
git commit -m 'squashed commit'
Другая возможность будет использовать rebase -i
раздавить / исправить все коммиты в один:
git checkout -b newbranch
git rebase -i C # now, replace every 'pick' with 'fixup'/'squash' except the first one
Также интерес представляет git merge --squash
:
Создайте рабочее дерево и состояние индекса, как если бы произошло реальное слияние (за исключением информации о слиянии), но на самом деле не выполняйте коммит, не перемещайте HEAD и не записывайте $GIT_DIR/MERGE_HEAD, чтобы следующая команда git commit создала слияние совершить. Это позволяет вам создать один коммит поверх текущей ветви, эффект которого такой же, как и слияние другой ветви (или более в случае осьминога).
git checkout -b newbranch C # create newbranch at commit C
git merge --squash mybranch
git commit -m 'squashed commit'