将我的所有提交压缩为一个用于GitHub pull请求

ome*_*erk 53 git github squash pull-request

我在GitHub上发了一个pull请求.现在,存储库的所有者正在说要将所有提交压缩成一个.

当我键入git rebase -iNotepad打开时,其中包含以下内容:

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

我在谷歌搜索但我不明白该怎么做.

fon*_*tno 48

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

git rebase -i HEAD~3 
Run Code Online (Sandbox Code Playgroud)

这将在编辑器中显示最后3次提交.

  • 为我做`git rebase -i HEAD~2`会带来一个包含20行提交的编辑器.而且这些都不是我想要的最后两次提交.这是怎么回事? (6认同)
  • 可能您之前的提交是合并。 (3认同)
  • 如果您已合并到具有最新更新的 master 等分支中,则这没有用 (2认同)

ome*_*erk 38

好吧,我想通了......首先我必须写下git rebase -i xxxxxxxxxxxxxxxxxxxxxxxxxx是我要压缩的提交的SHA.然后在记事本中我编辑了第一个作为壁球的选择和休息.然后会出现一个新的记事本窗口,在第一行中我输入了我的新提交的名称.然后我不得不做推力:

git push --force origin master
Run Code Online (Sandbox Code Playgroud)

  • @luckykrrish一个壁球如何提交公共拉动请求呢? (4认同)
  • 强制推送或重新绑定已经推送到远程的分支并不是一个好主意.所有其他拥有未经重新设计的主分支的人都会收到错误,他们会感到困惑. (3认同)
  • @luckykrrish 在你自己的 PR 分支上做这件事是完全可以接受的。 (3认同)
  • “高达”究竟是什么意思?xxxxxxxxxxx 是包含还是不包含? (2认同)

Ste*_*ica 9

从2016年4月1日开始,存储库管理器现在可以通过在拉取请求中选择"Squash and merge"来将拉取请求中的所有提交压缩到单个提交中.

壁球和合并选项

当然,如果您仍然想在合并之前手动压缩提交,则fontno的答案是最佳解决方案.


Con*_*ang 7

尝试git rebase -i,并使用'squash'进行您想要压缩的所有提交.

编辑:

git rebase -i将向您显示一个交互式编辑器,其中包含您正在重新定位的提交列表.每次提交之前的默认命令是"pick",所以你只需要s/pick/squash /用于你想要压缩的所有提交,然后所有这些提交将被压缩到他们上一次提交之前.

确保您在正确的分支上进行变基础.

  • 我没听懂..我已经说过,我对这些事情一无所知。 (2认同)
  • 当你写“s/pick/squash/”时,“s”选项是什么? (2认同)
  • 它是 `sed` 语法(Stream EDitor),一个非常强大但神秘的 Linux 工具。`s` 命令代表“切换”(或替换),后跟搜索字符串和替换字符串,用斜线分隔。通常后跟“g”,意思是“全局”,或者“不只是一次,而是到处进行这个替换”。所以`s/pick/squash/g` 的意思是:“用`squash` 替换`pick` 的每个实例”。 (2认同)