Мне лично нравится решение от wilhelmtell:
git reset --soft HEAD~3
git commit -m 'new commit message'
Однако я сделал псевдоним с некоторой проверкой ошибок, чтобы вы могли сделать это:
git squash 3 'my commit message'
Я рекомендую настроить псевдонимы, которые на самом деле запускают сценарии, чтобы было легче (а) кодировать ваши сценарии и (б) выполнять более сложную работу с проверкой ошибок.Ниже приведен скрипт для работы в сквош, а затем ниже скрипт для настройки псевдонимов git.
Скрипт для сквоша (squash.sh)
#!/bin/bash
#
#get number of commits to squash
squashCount=$1
#get the commit message
shift
commitMsg=$@
#regular expression to verify that squash number is an integer
regex='^[0-9]+$'
echo "---------------------------------"
echo "Will squash $squashCount commits"
echo "Commit message will be '$commitMsg'"
echo "...validating input"
if ! [[ $squashCount =~ $regex ]]
then
echo "Squash count must be an integer."
elif [ -z "$commitMsg" ]
then
echo "Invalid commit message. Make sure string is not empty"
else
echo "...input looks good"
echo "...proceeding to squash"
git reset --soft HEAD~$squashCount
git commit -m "$commitMsg"
echo "...done"
fi
echo
exit 0
Затем, чтобы подключить этот сценарий squash.sh к псевдониму git, создайте другой сценарий для настройки ваших псевдонимов git, например ( create_aliases.command или create_aliases.ш ):
#!/bin/sh
echo '-----------------------'
echo 'adding git aliases....'
echo '-----------------------'
echo
git config --global alias.squash "!bash -c 'bash <path to scripts directory>/squash.sh \$1 \$2' -"
#add your other git aliases setup here
#and here
#etc.
echo '------------------------------------'
echo 'here is your global gitconfig file:'
echo '------------------------------------'
more ~/.gitconfig
echo
echo
echo '----------------'
echo 'end of script...'
echo '----------------'