Что делает опция git commit --squash и почему она будет полезна? - PullRequest
3 голосов
/ 14 октября 2019

Я искал альтернативное решение для сжатия серии коммитов в ветке. Что я делал в прошлом, так это использовал git rebase -i HEAD~<#commits> и затем выбирал, какие коммиты раздавить. Обычно я pick редактировал последний коммит и подавлял избыточные коммиты между ними.

Этот подход работает достаточно хорошо, но я надеялся на более быстрый путь. Я заметил, что есть опция --squash для git commit. Но я не уверен, как это работает. Что именно он делает, и как вы его используете? Будет ли это решением моей проблемы?

Ответы [ 2 ]

4 голосов
/ 14 октября 2019

Документация объясняет это очень хорошо:

--squash=<commit>

Создание сообщения фиксации для использования с rebase --autosquash. Строка темы сообщения о фиксации берется из указанного коммита с префиксом «squash!». Может использоваться с дополнительными параметрами сообщения о фиксации (-m / -c / -C / -F). Подробности смотрите в git-rebase [1] .

Это означает, что --squash (также флаги --fixup) принимает коммит в качестве аргумента, иформатирует сообщение для использования с --autosquash. Можно установить rebase.autosquash = true в вашей конфигурации, чтобы сделать весь процесс короче.

Если вы хотите раздавить свои последние N коммитов, вы можете сделать следующее:

git reset --soft HEAD~N && git commit

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

0 голосов
/ 14 октября 2019

Предположим, вы работаете над веткой функций, где вы уже произвели 15 коммитов. Теперь вы закончили с заданием и хотите объединить его с мастером. Эти 15 коммитов сделают историю главной ветви длинной, лучший вариант - сжать их за один коммит, дать им полноценный комментарий. Мастер истории чист и хорош для вас, чтобы рассмотреть в будущем. Git merge master --sqash.

Теперь в IDE также очень хорошо поддерживается эта опция.

...