git - 删除一对旧的 git 提交

标签 git github

是否可以从 git 存储库中删除两个旧的提交?

例如,采用以下时间线: [数千次提交] > A > B > C > D > [数千次提交] > HEAD

我想删除“B”和“C”,但不更改任何以“D”开头的历史记录

一些注意事项:

  • “A”和“C”功能相同
  • “B”基本上是“删除存储库中的每个文件”
  • “C”基本上是“添加存储库中的每个文件”
  • 从 A 到 D 没有分支或备用路径(我们存储库的这一部分都是从另一个不支持分支的源代码控制系统转换而来的,因此对于任一方向的数千次提交来说都是非常线性的)
  • 我们的存储库现在托管在 GitHub 上,该存储库有无数的分支、 pull 请求和本地克隆,所有这些都可以追溯到“D”之后的数千次提交

如果可以纠正这一点,我很乐意这样做,因为它通过 stash 在此之前的任何提交来有效地破坏任何“blame ”功能。不太重要的是,它还破坏了 GitHub 的许多“图形”功能,因为这两次大规模提交导致了如此多的扩展。

我已经研究过恢复这两个提交,但它并没有真正帮助任何“blame ”功能(它只是将每一行的 blame 从“C”移至新的恢复提交)。听起来我正在寻找一个 rebase ,但这将如何影响分支末尾附近的任何事件工作?

最佳答案

你可以。如何执行取决于您是否已将这些更改推送到远程。

未推送的更改

如果更改尚未推送到远程,您可以简单地在良好的基本提交 ( A),排除最后一次错误提交的任何祖先(C):

git rebase --onto <commit-sha-of-A> <commit-sha-of-C> <commit-sha-of-D>

在有问题的分支上,使用 --onto 告诉它要 rebase 到哪个分支或提交。然后引用 C 的分支或提交来告诉它要排除哪些祖先。最后,引用 D 或其祖先的分支或提交来告诉它要 rebase 的祖先。

您来自:

-> A -> B -> C -> D

至:

-> A -> D
   \--> B -> C

推送的更改

如果您已经共享了这些更改,您将重写分支的历史记录,并可能会给您的队友带来额外的工作。您需要通知人们即将发生的变化。首先,使用与上述相同的方法修复本地存储库上的问题。当你准备好后,你必须将这种发散强制到远程:

git push --force <remote> <branch>

任何受此更改影响的人如果自己进行了更改,都会遇到 merge 问题。您将希望他们使用上述相同的方法在固定分支之上获取更改并重新调整其良好的更改(如果有)。

希望这有帮助!

关于git - 删除一对旧的 git 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39798475/

相关文章:

git - 如何在 git 的 post-checkout 钩子(Hook)中找出哪些文件发生了变化?

git - 如何将一个存储库的提交历史记录转移到另一个存储库?

git - npm 使用 git 信息而不是 package.json 中的版本发布

git - 我更新了来自上游/master 的 pull 请求的分支。如果我再次将分支推送到github,会污染 pull 请求吗?

docker - 我可以在 GitHub Actions 工作流程中引用 Dockerfile 而不是图像吗?

github - 直接从 github 更新托管网站文件

Git 克隆存储库错误 : RPC failed; result=56, HTTP 代码 = 200

Git - 重置本地更改

github - 如何仅合并拉取请求中的特定文件?

git - 不能再推送到 github origin master