将我所有的提交压缩为一个用于 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 拉取请求 [重复]的主要内容,如果未能解决你的问题,请参考以下文章