+++ date = "2012-09-04" title = "Git: Interactive Revert" tags = ["git", "protip"] slug = "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][1] 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. [1]: http://nvie.com/posts/a-successful-git-branching-model/