这为压缩多个提交提供了很好的解释:

http://git-scm.com/book/en/Git-Branching-Rebasing

但它不适用于已经推送的提交。如何在本地和远程回购中压缩最近的几次提交?

当我执行gitrebase-I origin/master ~4 master时,将第一个设置为pick,将其他三个设置为squash,然后退出(通过emacs中的c-x-c-c),我得到:

$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

其中2f40是选择提交。现在,4个提交都没有出现在git日志中。我希望我的编辑器重新启动,以便我可以输入一条提交消息。我做错了什么?


当前回答

对于可能感兴趣的人来说,这是在GitHub PR中压缩提交时的样子。

之前:

之后:

其他回答

当您使用Gitlab或Github时,您可能会以这种方式遇到麻烦。您可以使用上述方法之一压缩提交。我最喜欢的是:

git rebase -i HEAD~4
or
git rebase -i origin/master

为您的提交选择squash或fixup。此时,您将检查git状态。信息可能是:

    On branch ABC-1916-remote
    Your branch and 'origin/ABC-1916' have diverged,
    and have 1 and 7 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)

你可能会被诱惑去做。不要那样做,否则你会陷入和以前一样的境地。

相反,通过以下方式推到原点:

git push origin +ABC-1916-remote:ABC-1916

+只允许强制推动一个分支。

在我的案例中,要求将所有的功能分支提交压缩为一个,以便有一个干净的提交历史。利用GitHub UI实现了这一点。

问题:

功能分支(例如:featureBranch)已从master(一个月前)创建。将所有更改提交给featureBranch(约12次提交,一个月的工作)。并被定期推到远程。

要求:

使用主功能更新功能分支,并在功能分支中进行一次提交

遵循的步骤:

在GitHub UI中从master创建一个新分支(例如:featureBranchLatest)。创建从featureBranch到featureBranchLatest的PR。解决冲突(如果有)。将PR与GitHub UI中的挤压提交选项合并。(更改提交消息以获得更干净的消息)。

现在,featureBranchLatest将具有一次提交所需的所有更改,以及来自主服务器的最新更改。如果不需要参考,请删除旧的分支功能分支。

git rebase-i大师

您将打开编辑器vm,并发送类似这样的消息

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

在这里,我将所有其他提交的pick改为“f”(表示修正)。

git push-f原始功能/功能分支名称xyz

这将把所有提交修复为一个提交,并删除所有其他提交。我这样做了,这对我有帮助。

Squash使用本地提交

git rebase -i origin/master~4 master

然后用力推

git push origin +master

力与+

从git push的文档中:

注意--力应用于所有被推动的ref,因此使用它具有push.default设置为匹配或多个push使用remote.*.push配置的目标可能会覆盖其他引用比当前分支(包括严格落后的本地引用它们的远程对应物)。要强制推送仅一个分支,请使用+在refspec前面推送(例如git推送原点+主推送强制推到主分支)。

和接受的答案略有不同,但我很难理解,最终还是得到了答案。

$ git rebase -i HEAD~4

在打开的交互式屏幕上,用壁球替换pick在顶部显示所有要清除的提交。保存并关闭编辑器

按下遥控器,使用:

$ git push origin branch-name --force