Если вы посмотрите на « Обрезка GIT Checkins / Squashing GIT History », вы можете:
git rebase --interactive --fixup
для сжатия коммита, который вы бы вручную переупорядочили в коммитередактировать список rebase --interactive
, , игнорируя второе сообщение коммита , что ускорит редактирование сообщения (вы можете просто сохранить его: сжатый коммит будет иметь только первое сообщение коммита) git rebase --interactive --autosquash
для для вас автоматически выполняется процесс изменения порядка коммитов .
Именно поэтому мне нравится выбирать стандартный комментарий для всех микрокоммитов, которые я делаю,за действие.
Первый микро-коммит будет содержать «мое действие».
Все остальные будут содержать «squash! my activity
»
Несколько действий (набор микро-коммитов) могут быть переплетены вэтот процесс.
Все, что вам осталось, это git rebase --interactive --autosquash
для всех этих микро-коммитов, которые нужно переупорядочить, а затем раздавить.
OP namin упоминает сообщение в блоге Наш рабочий процесс Git: Private Development, Public Releases в качестве хорошей иллюстрации, основанный на git merge --squash
:
(см. также:
)
![alt text](https://i.stack.imgur.com/T6T2C.png)
Мы поддерживаем 3 ветви для каждой из наших клиентских библиотек:
master
- В этой ветке происходит активная разработка. release
- Разработка для исправления ошибок происходит здесь.Мы также поднимаем версии и обновляем журнал изменений в этой ветке. github_master
- Мы разбиваем коммиты из ветки релиза на отдельные коммита «release
» в этой ветке, а также помечаем тегамирелизы.Эта ветка отслеживает github/master
.
Теперь мы готовы перейти к ветви github_master.
git checkout github_master
Мы хотим объединитьизменения из релиза в ветку github_master, но мы не хотим видеть каждый отдельный коммит .
Git помогает нам с командой git merge --squash
.Это объединит все изменения от конкретного реферата, объединит их в единый набор изменений и оставит изменения поэтапно.Мы фиксируем поэтапные изменения с сообщением «1.0.0» и помечаем коммит.
git merge --squash release
git commit -m "1.0.0"
git tag 1.0.0 -m "1.0.0"
С коммитами, сжатыми и помеченными, пришло время нажать на github.
Мы хотим перенести заголовок текущей ветки в ветку master на github remote.
git push github HEAD:master
И последнее, но не менее важное: нам нужно перенести эти изменения в ветки в начале и объединитьсдавленный коммит возвращается к релизу и мастеру.
Вы можете подозревать, что git будет сбит с толку, объединяя сдавленный коммит обратно в ветви, содержащие не свернутые коммиты, но все работает так, как ожидалось ,Git достаточно умен, чтобы понимать, что не нужно вносить никаких изменений при слиянии в сдавленном коммите, но мы все равно должны объединяться, чтобы синхронизировать наши ветви.
git push origin github_master
git checkout release
git merge github_master
git push origin release
git checkout master
git merge release
git push origin master