如何删除本地git仓库中的特定提交?

时间:2012-03-15 20:41:13

标签: git git-commit

我的本​​地仓库包含以下提交:

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

字母更改位于远程仓库上。更改1,1.1和2是我不再需要的本地仓库中的临时更改。当我在B上创建一个未提交更改的存储时,这些可能是自动创建的;存储已被删除。我想让历史不那么复杂,这就是为什么我要摆脱这些。

我可以通过吹走我的本地仓库并再次克隆远程仓库来清除这些,但这似乎很重要。还有一个不在远程仓库中的本地分支我想保留。

从我到目前为止所阅读的内容来看,讨论的内容是如何将多个提交压缩为一个。删除提交对象时我找不到任何内容。我也试过" git prune<提交2的哈希>"它没有做任何事情。

如何摆脱提交对象1,1.1和2?

提前致谢。

4 个答案:

答案 0 :(得分:3)

只需转到您关心的提交并将其设置为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 :(得分:2)

假设您正在使用主分支,只需将其重置为origin / master(E):

git checkout master
git reset --hard origin/master

这将使您的提交对象松散,并在下次执行git gc

时进行清理

答案 2 :(得分:1)

您所描述的情况是gitk中显示的情况吗?完全刷新(Ctrl-F5)后它是否仍然相同?如果它保持不变,你仍然有一些引用指向提交“2.”删除该引用(很可能是一个分支),整个分支将消失。稍后,垃圾收集将删除提交对象。

答案 3 :(得分:0)

@Bombe和@Magnus Skog是对的(Lakshman Prasad很接近,但你说你想要摆脱1)。但也许你的意思是:“我把所有可见的引用(即分支和标记名称)抛到1,1.1和2,甚至做了git gc,我仍然在那里提交因为我可以通过SHA看到它们,并且它们占用了太多的磁盘空间“。

如果是这种情况,最简单的事情就是等待:你看不到的那些阻止空间被gc化的引用可能在reflog(.git/logs/)中。它们会在一段时间后过期,然后那些提交可以 gc'ed。或者,您可以使用git reflog --expire-unreachable强制它们更快地过期。另请参阅git reflog expire and git fsck --unreachable