将我所有的提交压缩为一个用于 GitHub 拉取请求 [重复]

Posted

技术标签:

【中文标题】将我所有的提交压缩为一个用于 GitHub 拉取请求 [重复]【英文标题】:Squash all my commits into one for GitHub pull request [duplicate] 【发布时间】:2013-01-10 03:50:33 【问题描述】:

我在 GitHub 上提出了拉取请求。现在存储库的所有者说要将所有提交压缩为一个。

当我输入git rebase -i 时,记事本打开,内容如下:

noop

# Rebase 0b13622..0b13622 onto 0b13622
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

我在 Google 上搜索过,但我不明白如何做到这一点。

【问题讨论】:

Squash my last X commits together using Git 的副本。 你不必再挤了:店主可以为你做(自 2016 年 3 月起):见***.com/a/36377439/6309 【参考方案1】:

As of April 1, 2016,存储库管理员可以通过在拉取请求上选择“压缩并合并”将拉取请求中的所有提交压缩为单个提交。

如果您想手动压缩拉取请求中的提交,请参阅fontno's answer。

【讨论】:

【参考方案2】:

好的,我想通了... 首先,我必须写 git rebase -i xxxxxxxxxxxxxxxx 其中 xxxxxxxxxx 是我要压缩的提交的 SHA。然后在记事本中,我将第一个编辑为挑选,其余的编辑为壁球。然后会出现一个新的记事本窗口,在第一行中我输入了新提交的名称。 然后我不得不做一个力推:

git push --force origin master

【讨论】:

强制推送或变基已经推送到远程的分支不是一个好主意。所有其他拥有未重新定位的 master 分支的人都会收到错误,他们会感到困惑。 “达到”究竟是什么意思? xxxxxxxxxxx 包含还是不包含? @luckykrrish 那么一个 squash 如何在公共拉取请求上提交呢? @luckykrrish 在你自己的 PR 分支上做这件事是完全可以接受的。 我遇到了冲突。非常感谢你。没有人在其他答案中提到这一点。【参考方案3】:

只是一个简单的补充,以帮助其他人寻找此解决方案。您可以传入您想要压缩的先前提交的数量。例如,

git rebase -i HEAD~3 

这将在编辑器中显示最后 3 个提交。

【讨论】:

为我做git rebase -i HEAD~2 会带来一个包含大约 20 行提交的编辑器。它们都不是我想要的最后两个提交。怎么回事? 可能你之前的提交是一个合并。 另请参阅下面@omerjerk 的回答,了解如何编辑从 pick 到 squash 的最后 2 个提交 如果您已合并到 master 等具有更新更新的分支中,这将没有用【参考方案4】:

尝试git rebase -i,并为所有要压缩的提交使用“压缩”。

编辑:

git rebase -i 将向您显示一个交互式编辑器,其中包含您正在变基的提交列表。每次提交之前的默认命令是“pick”,因此您只需要 s/pick/squash/ 来处理所有要压缩的提交,然后所有提交都将压缩到上一次提交。

确保你在正确的分支上重新定位。

【讨论】:

我没听懂。我已经说过我对这些东西一无所知。 git rebase -i 将向您显示一个交互式编辑器,其中包含您正在变基的提交列表。每次提交之前的默认命令是“pick”,所以你只需要 s/pick/squash/ 来处理你想要压缩的所有提交。 git rebase -i 后面是一个分支名称,请确保您已阅读我回答中的最后一句话。 写“s/pick/squash/”时,“s”选项是什么? 它是sed 语法(流编辑器),一个非常强大但晦涩难懂的 Linux 工具。 s 命令代表“切换”(或替换),后跟搜索字符串和替换字符串,用斜杠分隔。通常后跟“g”,意思是“全局”,或者“不只是一次,而是到处进行替换”。所以s/pick/squash/g 的意思是:“用squash 替换pick 的每个实例”。

以上是关于将我所有的提交压缩为一个用于 GitHub 拉取请求 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GitHub 上恢复拉取请求提交

AWS 'eb deploy' 总是压缩所有文件

GitHub:重新打开合并的拉取请求

完全恢复拉取请求

显示已在目标分支中的提交的 GitHub 拉取请求

在拉取请求完成时隐藏 Github 操作