Remove an unreferenced commit from git repository

2019-02-09 22:57发布

问题:

I have a git commit history like this:

          U
         / 
A---B---C---D---E master

Nothing points to the commit U, but I know its hash. How can I completely remove this commit from my repository as if it never existed? I'm the only person using this repo.

I tried using git rebase, but that can either delete parts of a branch or move commits, but doesn't seem to be able to delete a single commit.

If I do git checkout <hash> and then git reset --hard HEAD~1 I don't see the the commit anymore. Is it actually gone completely or is it still hidden in the repo?

回答1:

Eventually it will be cleaned up by git, but you can look into git gc to actually force a garbage collect.

The clean command is different and won't take care of this for you.



回答2:

As described here, simply use

git reflog expire --expire-unreachable=now --all
git gc --prune=now

git reflog expire --expire-unreachable=now --all removes all references of unreachable commits in reflog.

git gc --prune=now removes the commits themselves.

Attention: Only using git gc --prune=now will not work since those commits are still referenced in the reflog. Therefore, clearing the reflog is mandatory.