2012-03-15 76 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