Reverse Apply a commit to working copy
Another way that works is git show | git apply -R
. -R
stands for reverse the diff.
This works with any diffs, so you can do git diff [...] | git apply -R
Or reverse a stash git stash show -p stash@{0} | git apply -R
How about git revert -n
?
-n --no-commit
Usually the command automatically creates some commits with commit log messages stating which commits were reverted. This flag applies the changes necessary to revert the named commits to your working tree and the index, but does not make the commits. In addition, when this option is used, your index does not have to match the HEAD commit. The revert is done against the beginning state of your index.
This is useful when reverting more than one commits' effect to your index in a row.
If you are after previous commit(s). Then the simplest way is
git reset HEAD~ -- .
what it does it leaves your working tree intact but changes index to match the previous commit. Git diff and GUI tools will highlight changes and allow you to go through them to remove, revert or change some of the hunks. Subsequent git -a commit --amend
/ git -a commit
will fix either current commit or create a separate fix commit, while git reset --hard
will abandon them.
To pick an arbitrary change and leave tree at HEAD.
git revert -n <changeset> # or changeset range
git reset -s HEAD . # restore worktree to the tip (but leave staging as above)