Shouldn't "git checkout topic path" make the directory tree rooted at
path identical to what is on branch topic? It doesn't.
touch a b
git add a b
git commit -m 'base'
git checkout -b topic
git rm a
git commit -m 'removed a'
git checkout master
git checkout topic .
...and the result is...
No, the behaviour is correct.
- first you removed the file on the topic branch; at the same time
you removed it from your working tree
- then you switched back to the master branch and so the file was
added back to your working tree
- then you switched back to the topic branch, and seeing as the file
"a" is not being tracked in the topic branch Git doesn't touch it
In general, Git only meddles with stuff that you've told it to track.
This is actually a good thing in most cases because it makes some
workflows involving dirty trees or trees with untracked content
somewhat more convenient.
I'm not convinced...
"git checkout branch dir" should make dir have the same value it would
get if I just did "git checkout branch". The latter command will ignore
files only if they are untracked in *both* HEAD and branch. I fail to
see why the path-limited version of git-checkout should give a different
result on the part it is asked to affect than the non-path limited
version. This is very inconsistent and I'm having a hard time
understanding what workflow it will help.
I don't know the historical reasons for the difference but it's
explained in the second para of the man page:
When <paths> are given, this command does not switch branches. It
updates the named paths in the working tree from the index file
it runs git-checkout-index -f -u), or from a named commit.
So when you supply "." as a path it's not actually switching
branches. So that's why you see the different behaviour; it's
intentionally different. Like I said, I don't know the reasons why
but I imagine it's to make it easy to grab specific files from other
branches without actually switching.