Git: Interactive Revert

I recently made a commit in a project that, mistakenly, included changes to db/schema.rb. My local schema was out of date and this could cause trouble for the others in my team.

Luckily we use a successful git branching model so my changes were still up for review by the team.

The change I made was part of larger commit. But all I wanted was to revert serveral chunks from db/schema.rb that would cause trouble.

Interactive add

Now, there’s git add -i which allows you to selectively stage chunks for the next commit. Unfortunately, the process for reversing interactively is a bit more complicated, but not much.

Interactive revert

Well, let’s say you want to revert changes you made in commit f1e11c. Go to your feature branch and revert your changes for that commit but do not commit them yet, hence the -n option:

git revert -n f1e11c

Your working copy now contains staged changes to revert the entire f1e11c commit. You don’t want to revert everything, so unstage all those changes.

git reset

The key now is to interactively stage the changes you want to revert. You can do this like this:

git add -p

or

git add -i

Choose whichever suits you.

In my case I staged only the chunks that related to the changes in db/schema.rb that I wanted to revert.

With your reverting changes staged, commit them.

git commit

You’re now left with reverting changes you didn’t want to make. Just throw them away.

git reset --hard

And that’s all. You have now selectively reverted a commit.