【问题标题】:How to git rebase -i for a range of commits?如何 git rebase -i 进行一系列提交?
【发布时间】:2011-12-07 04:07:41
【问题描述】:

我可以使用 不包含最近提交的 rebase 来压缩本地功能/主题分支的一系列提交吗?这是针对我想要在它们被合并并推送到公共存储库之前准备的提交。

我工作得很快,做了一堆小的改动,标题和描述都很差,我想用一个很棒的 cmets 将它们压缩成两个或三个独立的逻辑提交。我可以选择 329aed9 和 af39283 之间的提交范围,这些提交可能会在此功能分支的短暂历史中的任何时间点出现吗?

git rebase -i RANGE_START_COMMIT_ID RANGE_LAST_COMMIT_ID

谢谢!

【问题讨论】:

  • 如果您使用 vim(Git 默认使用),您可以使用可视块模式 (ctrl-v) 一次将任意多个选择更改为 squashes。
  • 谢谢杰弗罗米。我终于弄清楚了如何使用 vim 进行挑选和挤压。对于其他初学者,运行 'git rebase -i mybranch~5' 其中 5 是要处理的最近提交的数量。如果您希望提交保持原样,请将其前缀保留为“pick”。否则将其行前缀从“pick”更改为“squash”,rebase 会将每个“squash”提交压缩到其上方标有“pick”的第一个提交。如果您有 10 个提交,并且将三个作为“pick”,其余作为“squash”,那么在 rebase 后您将获得总共三个提交的结果。我将发布一个屏幕截图,展示它是如何工作的。
  • 这不正是提交列表下方的帮助所说的吗?
  • 是的,但是从帮助中可以看出,您可以使用 pick 来保持某些提交不变,同时在单个 rebase 中修改其他提交。至少这对我来说是一种脱节,希望这对其他人有所帮助。

标签: git commit git-branch rebase git-rebase


【解决方案1】:

您始终可以使用git checkout -b new_branch af39283 创建一个新分支,然后对其进行变基。但是,如果您想在将来的某个时间点包含以后的提交,那么也没有办法绕过它们。提交的 SHA1 取决于其所有祖先提交。

【讨论】:

  • 卡尔,谢谢你的提示。我没有意识到可以生成一个 SHA 的新分支,但我尝试过并喜欢它。如果我们正在谈论创建四个不同的 squashes,那么使用这种方法似乎会为最后三个 squashes 创建一个新分支。原始特征分支将被重新定位为第一个壁球。最后,其他三个“git checkout -b new_branch SHA#”中的每一个都将合并到原始功能分支中,以创建一个光荣的完美分支?
  • 您是说您想要的最终结果是一个分支,其中包含 3 个压缩提交,然后是您的原始提交?如果是这种情况,在您执行rebase -i 时弹出的提交列表中,您只需将壁球的每个第一次提交的pick 更改为reword,为其他所有内容选择squash,然后离开您未修改的提交为pick
  • @Karl:你不需要重写 squashes 的第一次提交; Git 会自动让您编辑它们并提供所有压缩提交的消息作为起点。
【解决方案2】:

因此,“不包括”最近的提交是什么意思并不完全清楚,但是当您执行 rebase -i 时,您可以在没有对最后一次提交做任何事情。当然,您正在重写它下面的历史记录,因此它的差异将被重新应用,并且它将是变基之后的不同提交对象,但是由于您没有公开推送它(并且您正在重写它的其余部分) ) 这应该不重要。

【讨论】:

  • 感谢您的帮助。 “不包括”意味着我想制作单独的南瓜,但保持我最近的提交不变。最后一次提交很好,我希望它保持独立(不与任何其他人一起挤压)。然后有大约 20 个非常小的提交组,可以压缩成几个压缩提交。最后,它需要大约 60 个小提交并创建 4 个合理的提交以合并到公共回购中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 2021-02-24
  • 2019-11-17
  • 2013-01-13
相关资源
最近更新 更多