我用:

git checkout -b testbranch

我做了20次提交。

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

git rebase -i HEAD~20

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

git rebase -i all on this branch

当前回答

在之前的回答中,我没有看到任何关于如何处理“凌乱的分支”和“自我冲突”的信息。例如,我经常在我的特性分支(称为特性)上有主提交,这导致了它们之间的冲突。我发现这是最难处理的问题之一。

如何挤压凌乱的树枝?使用临时分支!

我发现Felix Rieseberg的解决方案是最好的。以下是我对他的建议略短的抄写:

Create a local tmp branch of off master git checkout master && git pull && git checkout -b tmp Merge all feature changes into tmp (without any commits, only staged file changes). git merge --squash $feature Manually solve all remaining "real conflicts" (This is the only step you cannot have a script do for you) Commit. tmp is now master + 1 commit (containing all changes). git commit ... Checkout feature and git reset --hard tmp (feature's original contents are gone, and it is now basically tmp, but renamed) git checkout $feature && git reset --hard tmp Ignore and override origin/feature (then clean up) git push -f && git branch -D tmp

Felix指出,这将产生最干净的合并,没有任何来自master和feature之间混乱/复杂关系的奇怪的自我冲突:

您可能会遇到一些不可避免的合并冲突。请相信,这是尽可能少的冲突,因为您跳过了最初创建的许多中间提交。

其他回答

如果你可以接受涉及另一个分支的答案,尝试git checkout——orphan <new_branch>它允许我简单地将前一个分支的所有文件作为一个提交。

这有点像git的合并压缩,但不完全相同。

假设你从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,你就不需要再这样做了,因为它在合并分支时有一个压缩选项。

假设你在特征分支上:

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

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

执行以下命令:

git reset --soft <base_commit_hash>

git commit --amend --no-edit

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

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

在特征分支中强制推送

git push --force 
git checkout -b temp
git checkout yourbranch
git fetch
git reset --hard origin/master
git merge --squash temp
git commit -m "new message" 

最简单的方法。

这将创建一个新的分支,然后将你的分支重置为基础分支,然后在将临时分支合并回我们的分支之前,我们压缩更改并创建一个新的提交

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

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

这是假设master是基础分支。