When moving to Git for version control, I was amazed at how much trouble people have trying to revert a file or project to a previous state, and even more so at the variety of solutions I saw. People try (and recommend) everything from surgical to nuclear approaches to this — e.g. git checkout …, git rebase …, git revert… git stash or branch & then discard…, or even delete your entire working directory and re-clone the repository! Yet with many of these, people would still end up with unwanted changes left in their working copy! One problem is that certain commands are only appropriate for changes that have been committed to your current index, while others are for those that have not.
When I have a version I want to roll back to, I don’t like having to sort through what’s committed and what’s uncommitted; I just want to get back to that version. I’m all about finding something that works reliably and repeatedly in a way that I understand. git checkout <i>start_point</i> <i>path</i> is the “something” that seems easiest to me for reverting specific files back to specific previous states, and so far this approach has never left me with undesired changes remaining in my working copy.
Here’s the skinny…
First, get a simple list of the last few commits (7 in this example) to the file in question:
~/projects/myproj$ git log -7 --oneline src/main/java/settings/datasources.xml
Output (newest to oldest):
74106b9 Renamed PROD database
db05364 Changed root password
0d56c8b Renamed QA database
efc7eb0 Changed some hibernate mappings
97e68fe Added comments
a2c492f Fixed xml indentation
c1b0310 Wrecked xml indentation
Let’s say those last two commits were erroneous. Then using the syntax “git checkout <start_point> <path>” you would just do:
~/projects/myproj$ git checkout 0d56c8b src/main/java/settings/datasource-context.xml
Have other tricks for making “rollbacks” easier? Let me know in the comments!