我正在尝试压缩一系列的提交 - 从 HEAD 到 HEAD~3。是否有快捷的方法可以做到这一点,还是需要使用交互式的 rebase 命令?
我正在尝试压缩一系列的提交 - 从 HEAD 到 HEAD~3。是否有快捷的方法可以做到这一点,还是需要使用交互式的 rebase 命令?
确保你的工作目录是干净的,然后
git reset --soft HEAD~3
git commit -m 'new commit message'
git reset --soft HEAD~3 && git commit -m "我的信息"
。 - KingCrunchgit 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。 - Lily Ballard我个人喜欢Wilhelmtell提供的解决方案:
git reset --soft HEAD~3
git commit -m 'new commit message'
然而,我创建了一个带有错误检查的别名,这样你就可以这样做:
g.squash 3 'my commit message'
我建议设置别名,实际上运行脚本,这样更容易(a)编写你的脚本和(b)进行更复杂的错误检查。下面是一个执行压缩工作的脚本。我将其放在我的HOME路径下的scripts文件夹中。
压缩脚本(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文件中添加了以下内容:
注:保留原文中的html标签。
export PATH="$PATH:$HOME/scripts" # Add scripts folder to PATH
...
alias g.squash='function _gSquash(){ sh squash.sh $1 $2; };_gSquash'
...
注意:您可以将别名设置为任何您想要的名称。我将我的许多git快捷方式设置为g. <myCommand>
。
注意:您可以将别名设置为任何您想要的名称。我将我的许多git快捷方式设置为g.<myCommand>
$PATH
中并将文件名命名为 git-squash.sh
,那么它会自动别名为 git squash
。我没有改变您的答案,以防使用 create-aliases.sh
脚本时有其他原因。 - user167661在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 commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"
如果您为此命令创建别名并使用别名代替该命令,则此命令将非常有用。
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
。这就是 harmonious 回答的方式。 - Maëlan你可以使用以下命令来实现:
git rebase --onto HEAD~4 HEAD~ master
这假设你在主分支上,且历史记录是线性的。它不完全是一个压缩操作,因为它会丢弃中间的提交记录。你需要修改新的 HEAD 来修改提交信息。
HEAD~4
作为其父提交记录。 - Greg Bacon