如何在推送后压缩git中的提交?

时间:2011-04-14 18:31:51

标签: git squash

这给出了压缩多次提交的一个很好的解释:

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

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

编辑:当我git rebase -i origin/master~4 master时,将第一个保留为pick,将其他三个设置为squash,然后退出(通过cx cc在emacs中),我得到:

$ 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是pick提交。现在,git log中没有出现4个提交。我希望我的编辑器能够重新启动,以便我可以输入提交消息。我做错了什么?

8 个答案:

答案 0 :(得分:640)

Squash在本地提交

git rebase -i origin/master~4 master

然后用

强行推动
git push origin +master

--force+

之间的差异

来自git push的文档:

  

请注意--force适用于所有推送的引用,因此使用   它将push.default设置为matching或多次推送   使用remote.*.push配置的目标可能会覆盖其他参考号   比当前分支(包括严格落后的本地裁判)   他们的远程对手)。要强制推送到一个分支,请使用+   在refspec面前推(例如git push origin +master强迫   推送到master分支。)

答案 1 :(得分:92)

在分支上,我能够像这样(最近4次提交)

config.vm.provider "virtualbox" do |vb|
  vb.name = "my-project (centos-67-x64)"
end

答案 2 :(得分:20)

只有创建一个branch才能解决很多问题。 处理master

git checkout -b mybranch

以下适用于remote提交已经推送过的&混合remote推送提交/ local仅提交:

# example merging 4 commits

git checkout mybranch
git rebase -i mybranch~4 mybranch

# at the interactive screen
# choose fixup for commit: 2 / 3 / 4

git push -u origin +mybranch

我也有一些pull request notes可能会有帮助。

答案 3 :(得分:19)

接受答案的细微差别,但我在挤压时遇到了很多困难,最后得到了它。

cannot use the part (children of children.children.1.children) to traverse the element
  • 在打开的交互式屏幕上,将选择替换为壁球 在你想要压制的所有提交的顶部。
  • 通过db.collection_name.updateOne({ 'name': 'test', 'children.name': 'child2', 'children.children.name': 'sub3' // locate sub3 }, { '$set':{'children.children.$.children':[some other content]} })
  • 保存并关闭编辑器

使用以下方式推送到遥控器:

$ git rebase -i HEAD~4

答案 4 :(得分:11)

git rebase -i master

你会得到编辑器vm open和msgs这样的东西

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

在这里,我已将所有其他提交的选择更改为“f”(代表修正)。

git push -f origin feature/feature-branch-name-xyz

这会将所有提交修复为一次提交,并将删除所有其他提交。 我这样做了,它帮了我。

答案 5 :(得分:1)

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

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

选择壁球或修补程序进行提交。此时,您将使用git status进行检查。消息可能是:

    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

+允许仅强制推送到一个分支。

答案 6 :(得分:0)

要压缩两个提交(其中一个已经被推送),可以在单个分支上进行以下工作:

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git push --force

默认情况下,这将包括最新提交的提交消息,作为对旧提交的注释。

答案 7 :(得分:0)

1)git rebase -i HEAD〜4

To elaborate: It works on the current branch; the HEAD~4 means squashing the latest four commits; interactive mode (-i)

2)此时,编辑器打开并显示了提交列表,以更改第二个及以后的提交,将南瓜替换为pick然后保存。

输出:成功地重新建立了基准并更新了refs / heads / branch-name。

3)git push origin refs / heads / branch-name --force

输出: ... 远程: 远程:要为分支名称创建合并请求,请访问: 远程:http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss 远程:到ip:sc / server.git  + 84b4b60 ... 5045693分支名称->分支名称(强制更新)