【问题标题】:Squash all my commits into one for GitHub pull request [duplicate]将我所有的提交压缩为一个用于 GitHub 拉取请求 [重复]
【发布时间】: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 上搜索过,但我不明白如何做到这一点。

【问题讨论】:

标签: git github pull-request squash


【解决方案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 的每个实例”。
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 2011-07-18
    • 2021-05-11
    • 2011-05-05
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多