git checkout
(1) does very different things whether given path specifier or not.
- With branch specifier only (
git checkout branch
) it will switch current working directory to specified branch, keeping local changes if possible and failing otherwise. If you already are onbranch
, it will do nothing at all. It only modifies files in the working directory that differ betweenHEAD
andbranch
and fails if any of them has local modifications (indexed or not). - With path specifier it will overwrite the all matching files (all files match
.
) with specified content:- With path specifier only (
git checkout .
) it writes content from index. That is, it undoes unstaged local modification. To undo staged modifications, usegit reset
with path specifier. - With both branch and path specifiers (
git checkout branch .
) it writes content in specified revision. It will not modify whereHEAD
points, so ifbranch
is different fromHEAD
, there will be unstaged changes afterwards.
- With path specifier only (
Note, that the man page distinguishes additional cases for use of the -b/–branch option and -p/–patch option, but those are mostly straightforward extensions of the above cases.