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

Lor*_*ren 494 git squash

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

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

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

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

$ 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
Run Code Online (Sandbox Code Playgroud)

其中2f40是pick提交.现在,4个提交中没有一个出现git log.我希望我的编辑器能够重新启动,以便我可以输入提交消息.我究竟做错了什么?

Ala*_*avi 709

壁球在当地提交

git rebase -i origin/master~4 master
Run Code Online (Sandbox Code Playgroud)

然后用力推动

git push origin +master
Run Code Online (Sandbox Code Playgroud)

--force和之间的区别+

来自以下文件git push:

请注意,--force适用于所有被推送的引用,因此使用它push.default设置为matching或配置了多个推送目标remote.*.push可能会覆盖当前分支以外的引用(包括严格落后于其远程对应的本地引用).要强制推送到一个分支,请使用+ refspec前面的推进(例如git push origin +master,强制推动master分支).

  • 当然,要意识到如果其他人可能已从远程存储库中撤出,您可能不想这样做 - 在这种情况下的答案是"你没有". (81认同)
  • 你也可以`git push --force origin master` (29认同)
  • 另外,我认为OP正在复制命令`git rebase -i origin/master`,并且实际上想要知道如何将提交更多地提交到例如`git rebase -i origin/master~20 master`. (10认同)
  • _ [Daenyth](http://stackoverflow.com/users/350351/daenyth)_:是的,但我总是喜欢这种语法,因为它更短. (7认同)
  • *[gstackoverflow](http://stackoverflow.com/users/2674303/gstackoverflow)*:`+`仅强制以其为前缀的refspec.`--force`将强制推送所有refspec.请参阅更新的答案. (6认同)
  • @Jefromi关于在远程分支上重写历史记录,你是正确的.但也有一些情况,这是一个好主意.例如,我为开源项目维护了几个私有存储库.我在不同的机器上测试它们,所以我将部分完成的分支一直推回到我的遥控器.当需要提出拉取请求时,我会压缩所有提交这种情况的提交.这是为开源项目做出贡献的首选方法.但正如你所提到的,关键是知道没有其他人在分支我的私人分支. (4认同)
  • 对于公共 git 服务,您很可能遇到 `denying non-fast-forward`,请参考 http://stackoverflow.com/questions/22026489/git-puzzler-working-around-denying-non-fast-forward寻求解决方案 (2认同)
  • 好的方法:)您也可以使用git push --force-with-lease强制推送(如果确实需要)以进行“平滑的强制”操作。在这里找到它:https://developer.atlassian.com/blog/2015/04/force-with-lease/ (2认同)
  • @SteveCohen 您必须将其中一个提交保留为“pick”:rebase 会将“squash”提交压缩到“pick”提交中(如果您将多个提交保留为 ',则可能是之前的第一个“选择”提交)挑选')。 (2认同)

jak*_*b-r 104

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

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
Run Code Online (Sandbox Code Playgroud)

  • 一吨?它怎么能超过4?你能详细说说吗? (3认同)
  • 我会接受这个作为预期的答案。更干净的接受答案。 (3认同)
  • 只需4个步骤即可获得最清晰,最明确的答案 (3认同)
  • 在已经推送的分支上使用软命令执行此操作最终为我推送了大量其他人的提交。 (2认同)

BLR*_*Boy 31

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

$ git rebase -i HEAD~4
Run Code Online (Sandbox Code Playgroud)
  • 在打开了交互式屏幕,顶替挑选南瓜 顶部为所有要壁球提交.
  • 保存并关闭编辑器 esc --> :wq

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

$ git push origin branch-name --force
Run Code Online (Sandbox Code Playgroud)

  • 正确且精确。用力推动很重要。推之前不要拉。 (3认同)
  • 简短有效,详细说明: (2认同)
  • esc --> :wq 前提是编辑器是 vi 或 vim (2认同)
  • 感谢那!只是给其他人的注释,我使用了 `+branch-name` 而不是 `branch-name --force`,正如另一个答案中所建议的那样 - 应该更安全(/sf/answers/396763531/) (2认同)

Stu*_*all 21

只需创建一个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
Run Code Online (Sandbox Code Playgroud)

我也有一些拉请求说明可能会有所帮助.


小智 13

Sqush 远程更改

  • 首先确保您的本地主机与远程主机处于同等水平
  • 然后将本地功能分支重置为与主分支相同:git reset --soft master
  • 然后将所有修改和更改(您在刚刚重置为 master 的本地功能分支上所做的修改和更改)添加到暂存区域: git add .
  • 然后提交这些更改: git commit -m "this is the final commit message"
  • 然后强制推送到远程分支: git push RemoteBranch --force


小智 12

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
Run Code Online (Sandbox Code Playgroud)

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

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

这将修复所有提交到一个提交,并将删除所有其他提交.我做到了这一点,它帮助了我.


lob*_*nds 7

为了在单个分支上压缩两个提交(其中一个已经被推送),可以使用以下方法:

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git push --force
Run Code Online (Sandbox Code Playgroud)

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


ter*_*ian 7

1) git rebase -i HEAD~4

详细说明:它适用于当前分支;HEAD~4 表示压缩最近的四次提交;交互模式 (-i)

2) 此时,编辑器打开,带有提交列表,更改第二次和后续提交,将 pick 替换为 squash 然后保存。

输出:成功地重新定位和更新 refs/heads/branch-name。

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

输出:

remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
 + 84b4b60...5045693 branch-name -> branch-name (forced update)
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

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

git rebase -i HEAD~4
or
git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)

为您的提交选择壁球或修复。此时,您将检查 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)
Run Code Online (Sandbox Code Playgroud)

你可能会想拉它。不要这样做,否则您将处于与以前相同的情况。

而是通过以下方式推送到您的原点:

git push origin +ABC-1916-remote:ABC-1916
Run Code Online (Sandbox Code Playgroud)

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