【问题标题】:remove commits (forever) from git history从 git 历史记录中删除提交(永远)
【发布时间】:2014-11-20 22:54:45
【问题描述】:

我想从 git 存储库的整个历史记录中永久删除指定的提交。看到this thread,推荐如下:

git reset --hard HEAD~4
git push origin HEAD --force

这很好并重置了我的存储库的状态,但它绝不会删除我的提交。我想从字面上回滚历史并放弃自 4 次修订以来对 repo 的更改。

谁能帮我解决这个问题? 当我尝试上述方法并查看 Github 中的修订历史时,我仍然看到不需要的提交。

我看到了this article,但我想在调查此解决方案之前检查是否有其他选项。

【问题讨论】:

  • 您写道:它绝不会删除我的提交。您试图摆脱的提交可能是其他引用的祖先的一部分。
  • 我应该很清楚 - 我只处理 master 分支,没有其他作者参与提交。
  • 好的,但是该命令在什么意义上绝不会删除[您的]提交?你还能在git log 的输出中看到它们吗?在您的远程仓库中?还是你的意思是别的?
  • 我在 Github 上看到了它们
  • 您是否尝试过(但请确保这是您想要的)git push --force origin master

标签: git github revision-history


【解决方案1】:

根据您的问题,您运行时实际发生了什么

git push origin HEAD --force

不清楚,但我能想到至少有两个原因导致它无法将master 强制推送到origin

  1. 当前签出的分支不是 master 并且是在origin 上已经是最新的分支,或者
  2. 你有一个分离的HEAD

通过运行git checkout master,确保master 确实是当前检查的分支;然后运行你的强制推送命令。或者,在git push 命令中明确指定master

git push --force origin master

应该可以的。

【讨论】:

    【解决方案2】:

    如果分支或标签不再引用不需要的提交(即称为“松散对象”),那么垃圾收集器将自动删除它们。默认情况下,GC 会作用于超过 90 天的对象。

    您仍然可以通过以下方式手动触发较早的 GC:

    git reflog expire --expire=now --all
    git gc --prune=all
    

    但是,这只会在您的本地存储库上起作用,而不是在 GitHub 上。 GitHub 每周运行一次 GC,并有自己的选项,因此如果您想现在删除提交,则必须删除存储库,重新创建它并在 GC 清理后推送您的本地。

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 2019-11-14
      • 2014-05-05
      • 1970-01-01
      • 2015-09-02
      • 2012-04-04
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      相关资源
      最近更新 更多