Я пытаюсь раздавить ряд коммитов - от HEAD до HEAD ~ 3. Есть ли быстрый способ сделать это или мне нужно использовать rebase --interactive?
git
interactive
rebase
squash
Phillip
источник
источник
Ответы:
Убедитесь, что ваше рабочее дерево чистое, затем
источник
git reset --soft HEAD~3 && git commit -m "my message"
git config alias.mysquash '!f(){ git reset --soft HEAD~$1 && git commit ${2:+-m "$2"}; };f'
.git mysquash 3 'some message'
будет работать, но я также изменил его, поэтому полностьюgit musquash 3
опущу флаг -m, чтобыgit commit
в этом случае вы получили интерактивный интерфейс.Мне лично нравится решение Вильгельмтелла :
Однако я сделал псевдоним с проверкой ошибок, чтобы вы могли это сделать:
Я рекомендую настроить псевдонимы, которые фактически запускают сценарии, чтобы было легче (а) кодировать ваши сценарии и (б) выполнять более сложную работу с проверкой ошибок. Ниже приведен сценарий, выполняющий работу по сквошу, а затем - сценарий для настройки псевдонимов git.
Скрипт для сквоша (squash.sh)
Затем, чтобы подключить этот скрипт squash.sh к псевдониму git, создайте еще один скрипт для настройки псевдонимов git следующим образом ( create_aliases.command или create_aliases.sh ):
источник
$PATH
named,git-squash.sh
и он автоматически получит псевдонимgit squash
. Я не изменил ваш ответ на случай, если есть причина использоватьcreate-aiases.sh
сценарий, о котором я не знаю.Чтобы добавить к ответу Вильгельмтелла, я считаю удобным выполнить мягкий сброс,
HEAD~2
а затем изменить фиксациюHEAD~3
:Это объединит все коммиты в
HEAD~3
коммит и будет использовать его сообщение о фиксации. Обязательно начинайте с чистого рабочего дерева.источник
Я использовал:
Работал вполне нормально. Только не пытайтесь завести журнал фиксации строкой, начинающейся с «выбрать» :)
источник
Используйте следующую команду, чтобы сжать последние 4 коммита внутри последнего коммита:
С псевдонимом:
С https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
источник
Вот один лайнер, чтобы раздавить последние 2 коммита. В этом примере будет сохранено сообщение о второй последней фиксации. Вы можете изменить сообщение по своему желанию.
Эта команда будет очень полезна, если вы создадите псевдоним для этой команды и вместо этого будете использовать псевдоним.
источник
Чтобы раздавить все, поскольку ветка была разветвлена от мастера:
источник
--reedit-message=HEAD
будет использовать сообщение последней фиксации, которая не является частью сжатия . Скорее всего, это не тот, который вам нужен. Чтобы включить сообщение о первом коммите , либо (1) заменитеHEAD
хешем коммита, сообщение о котором вы хотите, либо (2) перейдите к первому коммиту, который будет включен, иgit commit --amend --reedit-message=HEAD
. Вот что делает гармоничный ответ.Вы можете быть довольно близки с
Предполагается, что вы на мастере с линейной историей. Это не совсем сквош, потому что он отбрасывает промежуточные коммиты. Вам нужно будет изменить новый HEAD, чтобы изменить сообщение фиксации.
источник
HEAD~4
качестве своего родителя.