I need a commit to no longer be in the git database of commits. I need to be able to remove commit abc123... such that git checkout abc123... returns error: pathspec 'abc123...' did not match any file(s) known to git.
The QA Delete commits from a branch in Git answers this partially, as in how to remove references to a commit from the HEAD, but it doesn’t cover finding all of the branches a commit is present in nor does it cover expiring and purging the commit once it has been made a dangling commit.
How would I achieve this?
List all branches that contain the commit:
Remove commit from these branches:
If a changed branch is tracked in any remote, push it there with override:
e.g:
(Note that, depending on your development process, the commit may appear in untracked remote branches as well.)
Purge the commit, so it can not be restored from your local repo:
Note that you must also run this command on all remote repositories that had this commit. If you have no access to the remote repo, you have to cross your fingers — commit will eventually expire by itself and will be purged by
git gc.Be warned that above commands will remove all dangling objects from Git repo and all the history of branch changes — so you wouldn’t be able to restore (by non-forensic means) anything lost prior to its run.
Tell all collaborators to fetch changed branches and update any work they might have based on them. They should do as follows:
For each branch that is based on a branch you changed above (including the branch itself if they have it locally):
After they’re done: