Как я могу создать дочернюю ветку, которая включает все коммиты из другой ветки в один узел? - PullRequest
2 голосов
/ 01 сентября 2011

У меня есть ветвь, mybranch, которая имеет шесть коммитов и вытекает из коммита C. Я хотел бы создать новую ветку, также основанную на коммите C, которая эффективно включает в себя все коммиты из mybranch, сжатые в один коммит. Какой самый простой способ сделать это?

Мне нужно сделать это из-за мантры «сквош перед гит-пушом». Для новой ветки я не хочу упоминать о mybranch в истории, отправленной на удаленный сервер. Причина, по которой я хочу создать совершенно новую ветвь, используемую для push, заключается в том, что я хотел бы сохранить все коммиты в mybranch для справки.

1 Ответ

6 голосов
/ 01 сентября 2011

Почему только push-сжатые коммиты? Это звучит безумно (и неправильно).

Но чтобы ответить на ваш вопрос:

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'
...