How do I undo parts of my unstaged changes in git but keep the rest as unstaged? The way I figured out is:
git commit --interactive
# Choose the parts I want to delete
# Commit the changes
git stash
git rebase -i master # (I am an ancestor of master)
# Delete the line of the most recent commit
git stash apply
This works, but it would be nice if there were something like git commit --interactive only for reverting changes. Any better methods?
You can use
git checkout -p, which lets you choose individual hunks from the diff between your working copy and index to revert. Likewise,git add -pallows you to choose hunks to add to the index, andgit reset -pallows you to choose individual hunks from the diff between the index and HEAD to back out of the index.If you wish to snapshot your git repository beforehand to preserve these changes before reverting them, I like to do:
If you use that often, you might want to alias it:
Reverting individual hunks or lines can be even easier if you use a good editor mode or plugin, which may provide support for selecting lines directly to revert, as
-pcan be a bit clumsy to use sometimes. I use Magit, an Emacs mode that is very helpful for working with Git. In Magit, you can runmagit-status, find the diffs for the changes that you want to revert, select the lines you wish to revert (or simply put the cursor on hunks you wish to revert if you want to revert a hunk at a time instead of a line at a time), and presskto revert those specific lines. I highly recommend Magit if you use Emacs.