Answers:
确保您的工作树是干净的,然后
git reset --soft HEAD~3
git commit -m 'new commit message'
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
在这种情况下获得交互式UI。
我个人喜欢wilhelmtell的解决方案:
git reset --soft HEAD~3
git commit -m 'new commit message'
但是,我对别名进行了一些错误检查,以便您可以执行此操作:
git squash 3 'my commit message'
我建议设置实际运行脚本的别名,以使(a)编写脚本代码和(b)进行错误检查更加复杂。下面是执行壁球工作的脚本,然后在下面是用于设置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.sh):
#!/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 '----------------'
为了增加wilhelmtell的答案,我发现软重置为HEAD~2
,然后修改以下内容的提交很方便HEAD~3
:
git reset --soft HEAD~2
git commit --all --amend --no-edit
这会将所有提交合并到HEAD~3
提交并使用其提交消息。确保从干净的工作树开始。
我用了:
EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>
工作得很好。只是不要尝试使用以“ pick”开头的行作为提交日志:)
使用以下命令将最后4次提交压缩为最后一次提交:
git squash 4
使用别名:
squash = !"f() { NL=$1; GIT_EDITOR=\"sed -i '2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}'\"; git rebase -i HEAD~$NL; }; f"
sq = !git squash $1
sqpsf = !git squash $1 && git psf
来自https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
压榨自分支机构分支以来的所有内容:
git reset --soft $(git merge-base --fork-point master) \
&& git commit --verbose --reedit-message=HEAD --reset-author
--reedit-message=HEAD
将使用不属于压榨的最后一次提交的消息。这可能不是您想要的。为了获得要包含的第一个提交的消息,或者(1)替换HEAD
为您希望消息包含的提交的哈希值,或者(2)跳转到要包含的第一个提交的消息和git commit --amend --reedit-message=HEAD
。这就是和谐的答案。
您可以与之接近
git rebase --on到HEAD〜4 HEAD〜master
假设您掌握线性历史记录。它不是壁球,因为它会丢弃中间提交。您需要修改新的HEAD才能修改提交消息。
HEAD~4
其父级。