Magit implements five "apply variants" described in the manual: stage, unstage, discard"regular apply", reversediscard, and "regular apply"reverse. The first three should be pretty obvious to everymost Git userusers. The latter two do not exist in the Git porcelain (in Magit they are implemented using Git plumbing commands and Emacs Lisp).
These two variants are described like this:
- Discard. On a staged change, remove it from the working tree and the index. On an unstaged change, remove it from the working tree only.
- Reverse. Reverse a change in the working tree. Both committed and staged changes can be reversed. Unstaged changes cannot be reversed. Discard them instead.
These two variants do very different things, so neither of these variants should fall back to the other variant in cases where itself cannot be used. Keeping the old behavior (of falling back from reverse to discard in some contexts) might have been more convenient in the short run, but in the long run it prevents users from really trying to understand what these two variants are for.
Discard is much more dangerous than reverse. The former "throws away uncommitted changes" (this change isthese changes are lost, it'sthey are not anywhere anymore), while the latter actually "creates changes", by taking an older change and doing the opposite in the worktree (the old change is not lost, it is still in a commit or the index).
Falling back from "creating" to "deleting" is very dangerous, so Magit doesn't do that anymore.
Also note by using the new wip modes you can protect yourself from losing changes due to an accidental discard.