141

我正在尝试压缩一系列提交 - 从 HEAD 到 HEAD~3。有没有一种快速的方法可以做到这一点,还是我需要使用 rebase --interactive?

4

8 回答 8

167

确保你的工作树是干净的,然后

git reset --soft HEAD~3
git commit -m 'new commit message'
于 2011-09-01T19:46:25.447 回答
37

我个人喜欢wilhelmtell 的解决方案:

git reset --soft HEAD~3
git commit -m 'new commit message'

但是,我创建了一个带有一些错误检查的别名,以便您可以这样做:

g.squash 3 'my commit message'

我建议设置实际运行脚本的别名,以便更容易 (a) 编写脚本和 (b) 进行更复杂的错误检查工作。下面是一个执行挤压工作的脚本。我把它放在我的 HOME 路径中的脚本文件夹中。

压缩脚本 (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脚本连接到别名,我将以下内容添加到我的 .zprofile 中:

export PATH="$PATH:$HOME/scripts" # Add scripts folder to PATH
...
alias g.squash='function _gSquash(){ sh squash.sh $1 $2; };_gSquash'
...

注意:您可以随意设置别名。我有很多我的 git 快捷方式g.<myCommand>

于 2014-06-03T14:58:04.013 回答
23

要添加wilhelmtell的答案,我发现软重置HEAD~2然后修改提交很方便HEAD~3

git reset --soft HEAD~2
git commit --all --amend --no-edit    

这会将所有提交合并到HEAD~3提交并使用其提交消息。一定要从干净的工作树开始。

于 2017-08-20T10:20:45.700 回答
10

我用了:

EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>

工作得很好。只是不要尝试有一个以“pick”开头的行的提交日志:)

于 2013-09-20T10:05:37.567 回答
3

使用以下命令压缩最后一次提交中的最后 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

于 2015-03-01T02:13:09.610 回答
2

这是一个用于压缩最后 2 次提交的单行。在此示例中,将保留倒数第二次提交的消息。您可以根据需要更改消息。

git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"

如果您为此命令创建别名并改用别名,此命令将非常有用。

于 2017-06-28T12:26:08.170 回答
1

自从分支从 master 分叉以来,要压缩所有内容:

git reset --soft $(git merge-base --fork-point master) \
  && git commit --verbose --reedit-message=HEAD --reset-author
于 2018-02-12T19:56:49.410 回答
-1

你可以非常接近

git rebase --onto HEAD~4 HEAD~ master

这假设您是具有线性历史的大师。它不是一个壁球,因为它丢弃了中间提交。您需要修改新的 HEAD 以修改提交消息。

于 2011-09-01T19:54:47.257 回答