> 2) Destroy all local modifications, if foo is a file.
Not exactly. It updates the file to the state from the index.
git-checkout is just poorly overloaded. The idea is the same in both operations (updating some set of files in the working directory to some state from this or some other branch) but the two should be separated.