2016-06-07 76 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