2012-03-15 133 views
0

我的本地回購包含以下提交:如何刪除本地git倉庫中的特定提交?

A ---- B ---- C ---- D ---- E 
     \ 
     1 ---- 2 
      \ /
      1.1 

標有字母的變化是在遠程回購。變更1,1.1和2是我不再需要的本地回購協議中的臨時更改。這些可能已經自動創建時,我創建了一個隱藏在B頂部的未提交更改;該存儲已被刪除。我想讓歷史不那麼複雜,這就是爲什麼我想擺脫這些。

我可以清楚地擺脫這些,吹掉我的本地回購和克隆遠程回購再次,但這似乎交手。並且有一個本地分支不在我想要保留的遠程回購中。

從我迄今爲止閱讀的內容來看,討論的內容是如何將多個提交壓縮爲一個。我沒有發現刪除提交對象的任何內容。我也嘗試「git修剪<提交2 >的哈希」,它沒有做任何事情。

我該如何擺脫提交對象1,1.1和2?

在此先感謝。

回答

1

是你描述了在gitk所示的情況?完成刷新後(Ctrl-F5)是否仍然相同?如果它保持不變,你仍然有一些參考指向提交「2.」刪除該引用(最可能是一個分支),整個分支將消失。稍後,垃圾收集器將刪除提交對象。

+0

謝謝! F5(刷新)沒有這樣做,但Ctrl + F5(重新加載)。我沒有意識到刷新會使它處於一種狀態,好吧,不是那麼新鮮;-)。 – mbells 2012-03-16 14:56:48

2

只需轉到您關心的提交併將其設置爲HEAD即可。 git垃圾在稍後的時間點收集1.1和2。

git checkout sha-of-1 
git reset --hard HEAD 

的另一種方式去同樣的事情將是:

  • 創建一個從點你所關心的一個新的分支。
  • 刪除所有其他分支。

    git checkout sha-of-1 
    git checkout -b new-branch 
    git branch -D 'the branches that have 1.1 and 2' 
    
1

假設你在主分支上工作,只是將其重置爲原點/主(E):

git checkout master 
git reset --hard origin/master 

這會讓你的對象提交散裝物品,下次將被清理你做的git GC

0

@Bombe和@Magnus Skog是對的(Lakshman Prasad很接近,但你說你也想擺脫1)。但是也許你的意思是:「我已經把所有可見的引用(即分支和標籤名稱)都扔到了1,1.1和2,甚至完成了git gc,我仍然有提交,因爲我可以看到他們通過SHA,他們佔用了太多的磁盤空間「。

如果是這種情況,最簡單的方法就是等待:您無法看到的阻止空格被刪除的引用可能位於reflog(.git/logs/)中。他們在一段時間後過期,然後那些承諾可以 gc'ed。或者,您可以使用git reflog --expire-unreachable強制他們更快地過期。另見git reflog expire and git fsck --unreachable