Jawap
Jawap

Reputation: 2543

Remove an unreferenced commit from git repository

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?

Upvotes: 10

Views: 5258

Answers (2)

jiasli
jiasli

Reputation: 9128

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.

Upvotes: 20

Chris Missal
Chris Missal

Reputation: 6123

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.

Upvotes: 5

Related Questions