1

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

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

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

我可以通过删除我的本地存储库并再次克隆远程存储库来清楚地摆脱这些,但这似乎很沉重。并且有一个本地分支不在我想保留的远程仓库中。

从我目前所读到的内容来看,讨论一直是关于如何将多个提交压缩为一个。我没有发现任何关于删除提交对象的内容。我还尝试“git prune <hash of commit 2>”但它没有做任何事情。

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

提前致谢。

4

4 回答 4

4

只需转到您关心的提交并将其设置为 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'
    
于 2012-03-15T20:51:49.933 回答
2

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

git checkout master
git reset --hard origin/master

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

于 2012-03-15T21:06:17.780 回答
1

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

于 2012-03-15T21:01:18.777 回答
1

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

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

于 2012-03-16T07:05:29.320 回答