2016-06-07 79 views
0

如何删除提交我有这种情况:喜欢这些

    B  C  D 
       /-----*-----*-----* 
-*---*---*---*---*---* branch A 
A1 A2 A3 A4 A5 A6 

承诺B,C,d不属于任何一间分行。如果我运行我的花式git lg它不显示任何附近的分支标签(它为主,起源/主,HEAD,主题分支等)。如果我检查它们,我将移动到“脱离头部”状态(这是预期的,因为我可以检查它们的唯一方法是使用sha1)。我如何删除它们?

事情我试过到目前为止:

  1. 结帐承诺d和运行git reset HEAD~3 --hard,HEAD指针移动到A4,但提交还在这里。
  2. 手动运行git reflog expire --expire=now --all,依次为git gc --prune=now,提交仍在此处。

发生了什么以及如何删除这些提交?

编辑:39d9480是有问题的提交之一。试图与合并基础实验,得到了这个输出:

git merge-base --is-ancestor 39d9480 master; echo $? 
0 
git merge-base --is-ancestor master 39d9480; echo $? 
1 

我没有看到这个承诺试图变基时。

+0

如果你已经做了引用日志到期和GC,他们通常会在这一点上走了,暗示有*东西*仍然指向它们(例如'git filter-branch'留下的'refs/originals /'命名空间)。你的'git lg'别名扩展到了什么地方? – torek

+0

'git log --graph --oneline --decorate' – 0xCAFEBABE

+0

去检查参考/原件。 – 0xCAFEBABE

回答

-1

据我所知,你不能自己删除提交。多亏Git,他们会在一段时间后消失。但他们不会对你的工作地干扰:)

+0

是的,它们不会干涉,但我想了解发生了什么。 – 0xCAFEBABE

+0

我认为Git允许你恢复你的工作,如果你做了一些废话......但它只是一个理论。我帮不了你,我还没有找到答案 – FrenchieTucker

+0

是的,它有强大的工具来恢复像'git reflog'这样的工作,但是这种情况恰恰相反。我想从历史中丢失这些提交,但找不到一种方法来删除它们。 – 0xCAFEBABE

-1

你可以试试这个创建一个分支,它重订不了了之,并删除它:

git checkout D_HASH 
git checkout -b disposable 
git rebase -i HEAD~4 
[ interactively delete commits from branch only -- do NOT delete A4 ] 
git branch -D disposable 
+0

我试过这个,分支被删除但提交在那里。正如上面提到的@torek,它看起来像是其他的东西引用了这些提交。 – 0xCAFEBABE

0

git branch命令仅扫描本地和远程分支机构。该脚本将显示任何种类的参考其中包含与给定哈希提交:

git for-each-ref -s --format 'if git merge-base --is-ancestor哈希%(refname); then printf "%s\n" %(refname); else :; fi;'|/bin/sh -

+0

尝试使用它,没有输出。 – 0xCAFEBABE