Git Basics: Rewriting a branch's commit history from scratch

Igor Marques da Silva
magnetis backstage
Published in
2 min readOct 23, 2018
Photo by Zach Reiner on Unsplash

With this post you'll learn how to rewrite the whole history of a branch. In other words: undoing all commits but keeping their changes to be committed again.

Let's say you have four commits:

f7f3f6d Create FileA
310154e Update FileA with x
a5f4a0d Create FileB
421265e Update files A and B with Y and Z

But you want to rewrite the whole history to have just two:

Create file A with X and Y
Create file B with Z

Sure you can manipulate the tree of changes with the git rebase -i command (reference), but there is a more straightforward way of rewriting a branch: with git reset --soft .

Let's see how to use this command.

Doing a Soft Reset

Assuming you're branch was created from a branch named master, just run (running a git fetch originfirst is recommended):

$ git reset --soft origin/master

Now you're going to have all of your commits undone, but their changes will be kept as added to your stash. You can also use HEAD~4 instead of origin/master to undo the last four commits, for example.

So, running a git status should return something like

$ git statusOn branch your_branch_nameYour branch is ahead of ‘origin/your_branch_name’ by X commits.  (use “git push” to publish your local commits)Changes to be committed:  (use “git reset HEAD <file>…” to unstage)modified: FileA
modified: FileB

Again, you can see that both FileA and FileB are added, but not commited. You can undo this by running git reset HEAD . (your changes will remain, don't worry).

Now you're free to rewrite your commit history as you want!

Disclaimer: if you already have pushed your changes to a remote repository, you're going to use git push --force to send the new changes to the repository. Proceed with caution!

--

--