有没有一种方法可以非交互地压缩一些提交?

我试图压扁一系列的提交 – HEAD〜HEAD〜3。 有没有一个快速的方法来做到这一点,或者我需要使用rebase – interactive?

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

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

我个人喜欢wilhelmtell的解决scheme:

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

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

 git squash 3 'my commit message' 

我build议设置实际运行脚本的别名,以便更容易(a)编写脚本,(b)通过错误检查执行更复杂的工作。 下面是一个脚本,做的南瓜的工作,然后下面是一个脚本来设置你的git别名。

压缩脚本(squash.sh)

 #!/bin/sh # #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别名上,创build另一个脚本来设置你的git别名( create_aliases.command或者create_aliases.sh ):

 #!/bin/sh echo '-----------------------' echo 'adding git aliases....' echo '-----------------------' echo git config --global alias.squash "!sh -c 'sh <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 '----------------' 

我用了:

 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

为了增加wilhelmtell的答案,我发现软复位到HEAD〜2 ,然后修改HEAD〜3的提交是很方便的:

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

这会将所有提交合并到HEAD_3提交并使用它的提交信息。 一定要从干净的工作树开始。

这是一个单线程来压缩最后2个提交。 在这个例子中,第二次提交的消息将被保留。 您可以根据需要更改信息。

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

如果为此命令创build别名并使用别名,此命令将非常有用。

你可以近距离接触

  git rebase  -  head HEAD〜4 HEAD〜master 

这假设你是一个线性历史的主人。 这不是一个挤压,因为它放弃了中间提交。 您需要修改新的HEAD以修改提交消息。

Interesting Posts