代码之家  ›  专栏  ›  技术社区  ›  omu_negru

` git checkout commit_id`在'git gc之后仍然有效`

  •  1
  • omu_negru  · 技术社区  · 6 年前

    我有一个提交,在执行了它所连接到的分支上的一个Rebase之后,应该让它悬空/不可访问,并且该提交在进程中被压扁。 git rebase -i <other commit id>

    现在,如果我愿意的话 git branch --contains ID 我什么也得不到。

    所以我做了一个 git gc --prune=now --aggressive . 现在我 假定 这应该有效地删除挂起的提交,因此不再需要对它的引用,但是 git checkout ID 仍然有效。

    知道我在这里做错什么了吗?我也做了一个 git remote remove origin 因为我担心结帐实际上是与来源工作,但结果是相同的。 提前谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   Git.Coach    6 年前

    如果可能,使用以下命令为您的承诺生成一个符号引用。

    git name-rev <hash>

    偶然遇到类似的情况,当 tag 仍在引用挂起的提交。此命令返回标记和提交的相对位置 ~1

    如果此命令不返回有帮助的结果,也可以从reflog中引用它。在运行垃圾收集之前,您是否尝试过将无法到达的提交过期?

    git reflog expire --expire-unreachable=now --all

    编辑: 我有点困惑,即使是最后一个命令也无法强制垃圾收集来获取您的提交。您的存储库有多大?因为你用了 --aggressive 当您尝试第二个垃圾收集时,第一个垃圾收集的标志(可能是)第一个垃圾收集进程仍在进行中?你可以用 git gc --force 结合其他参数立即运行GC,即使有其他垃圾收集正在运行。

    --力

    强制git gc运行,即使此存储库上可能正在运行另一个git gc实例。