我用:

git checkout -b testbranch

我做了20次提交。

现在我想要压缩这20个提交。我是这样做的:

git rebase -i HEAD~20

如果我不知道有多少次提交呢?有没有什么方法可以做到:

git rebase -i all on this branch

当前回答

你正在做的事情很容易出错。只做:

git rebase -i master

它会自动将你的分支的提交重置到当前最新的主节点上。

其他回答

在阅读了几个关于压缩的Stackoverflow问题和答案后,我认为这是一个很好的压缩分支上所有提交的代码行:

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master

这是假设master是基础分支。

你正在做的事情很容易出错。只做:

git rebase -i master

它会自动将你的分支的提交重置到当前最新的主节点上。

假设你在特征分支上:

在特性分支中找到第一个提交。如果你正在使用gitlab或github,你可以直接在分支中查看它,并从那里复制散列,或者你可以使用以下命令:

Git日志<source_branch>..< feature_branch >——漂亮=格式:% h

执行以下命令:

git reset --soft <base_commit_hash>

git commit --amend --no-edit

现在在这个阶段,在您的本地,您有一个提交,其中包括在所有以前的提交中所做的更改。

回顾它,你需要用力推它。在强制推送之后,所有的更改都将合并到一个提交中,而您的分支将只有1个提交。

在特征分支中强制推送

git push --force 

由于我在这里提出的解决方案中遇到了一些麻烦,我想分享一个非常简单的解决方案(无论如何都是有效的):

git merge origin/master && git reset --soft origin/master

前面的合并cmd确保,在提交时,没有来自master的最近更改会出现在你的头上(倒置)!之后,只需提交更改并执行git push -f

假设你从master分支,你不需要一直输入你的branch到重置步骤:

git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"

解释:

git revlist——count HEAD ^master自master创建feature分支以来的提交次数,f.ex。20. git reset——soft HEAD~20将对最近20次提交进行软重置。这将把更改保留在文件中,但删除提交。

用法:

在我的.bash_profile中,我为gisquash添加了一个别名,用一个命令就可以做到这一点:

# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'

在重置和提交后,你需要做一个git push -force。

提示:

如果你正在使用Gitlab >= 11.0,你就不需要再这样做了,因为它在合并分支时有一个压缩选项。