Rewrite Git History
Want to collapse all commits into ONE ? Pretend you built it all in one shot ?
git checkout main
git reset $(git commit-tree HEAD^{tree} -m "Your single commit message")
git push --force
Step 1
git checkout main
Points your current branch (main
) to that new commit hash.
Switches to the main
branch (or whatever branch you're cleaning up).
Step 2
git commit-tree HEAD^{tree} -m "Your single commit message"
Creates a brand new root commit (no parents) from your current working tree (all files as they are now), with your custom message.
HEAD^{tree}
grabs the current tree (your latest file state).
git commit-tree
creates a new commit object from that tree.
git reset <hash>
moves the main
pointer to the new commit (the one created with no history).
Step 3
git push --force
Force-pushes the rewritten branch to remote repository, overwriting the old history.
Why would you do this ?
Clean history for handoff ( If you're pushing a project for the first time , of want to hide intermediary comit messages in your branch before merging )
Hiding sensitive or messy development history.
Why NOT to do this ?
You lose the entire commit history—which means no granular tracking, no incremental changes, no understanding of how things evolved.
Force pushing is in most cases a tricky option when working with collaborators.