【问题标题】:Squash commits in gitgit 中的壁球提交
【发布时间】:2016-08-17 22:35:11
【问题描述】:

所以我分叉,然后分支,并提交代码。现在我有 15 个工作提交,我需要压缩成一个。

首先我合并上游代码。

git fetch upstream master
git merge upstream/master master

然后我在我所在的分支上(不是在 master 上)尝试压缩最后 15 次提交

git rebase -i HEAD~15

现在我出现了数百个与我的分支完全无关的提交。所有在线教程都是非常基础的,我认为它应该在分叉的工作流程中略有不同。

我错过了什么?

【问题讨论】:

  • 您介意做三件事以便我可以帮助您:1.) 在您当前的分支上获取“git log --date-order --pretty="%h|%p|% 的输出d“头~15..头”。 2.) 将上述输出粘贴到此处bit-booster.com/graph.html 的工具中 3.) 将生成的图表的屏幕截图附加到您的问题中。
  • 这是图表imgur.com/a/384R3
  • 这真的来自“git log --date-order --pretty="%h|%p|%d" HEAD~15..HEAD”吗?如果最高的绿点是分叉分支上的 HEAD,这可能是有道理的。是吗?

标签: git rebase squash


【解决方案1】:

我想你会想squash进入目标分支的路上,而不是它(通常)。因此,如果您有一个更改分支并希望将它们压缩为 master,则根据您的工作流程有几个选项。

CLI

# while on master
$ git merge my-feature-branch --squash

Github

在 Github 中,您可以在合并 PR 时选择压缩合并 https://github.com/blog/2141-squash-your-commits

Bitbucket / 存储

他们会自动为您执行此操作。

【讨论】:

    【解决方案2】:

    git rebase -i 的行为在你在 rebase 下的提交子集中合并时和如果你没有合并时是不同的。在您的情况下,您首先合并,然后您想要重新基于包含合并的提交子集。

    一般来说,我会避免重新合并提交以保持简单。

    正如@thescientist 所说,在您的情况下,在合并时压缩提交比在合并后更好。

    可能有帮助的一句话:

    通常,当您在线性历史记录上调用 git rebase -i 时,您会看到提交列表,并且您不会更改任何内容(只需保留 pick),不会发生任何操作,也不会重写任何历史记录

    然而,当你发现自己不小心在一个太大的提交子集上运行了git rebase -i,这涉及到合并提交,你经常会看到一个很大的提交列表,如果你不做任何改变(保持pick ),git 将开始重写那些提交,这通常不是你想要的。 要摆脱这种情况,请删除所有行;通常,当在变基期间删除某些行时,git 会删除与这些行对应的提交,但如果您删除所有行,git 将什么也不做 - 这是一种在您搞砸时中止的有用方法 -因为如果你想放弃所有提交,你会使用git reset --hard <desired_commit>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-15
      • 2018-04-24
      • 2013-10-11
      • 1970-01-01
      • 2012-04-10
      • 2010-11-30
      • 1970-01-01
      • 2014-07-27
      相关资源
      最近更新 更多