Reputation: 6960
What is the difference between the following git
commands:
git checkout branch
git checkout branch .
git checkout . #<-- used at the branch
Why when I checkout different branches into different folders with first one I missed some files.
But when I am using the second command, everything is ok?
Upvotes: 54
Views: 33208
Reputation: 76276
git checkout
(1) does very different things whether given path specifier or not.
git checkout branch
) it will switch current working directory to specified branch, keeping local changes if possible and failing otherwise. If you already are on branch
, it will do nothing at all. It only modifies files in the working directory that differ between HEAD
and branch
and fails if any of them has local modifications (indexed or not)..
) with specified content:
git checkout .
) it writes content from index. That is, it undoes unstaged local modification. To undo staged modifications, use git reset
with path specifier.git checkout branch .
) it writes content in specified revision. It will not modify where HEAD
points, so if branch
is different from HEAD
, there will be unstaged changes afterwards.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.
Upvotes: 79
Reputation: 4922
The above explanation is fine but let me explain with examples.
git checkout
can be used with files folders and branches.
Let say there is index.html
file and dev
folder.
If I accidentally change index.html
and i want to undo that I will simply run git checkout index.html
. It will get my file back to its original form.
Now let say I made some changes inside dev folder and and want those changes back inside dev folder. If I will use git checkout dev
and if there is any dev
branch then it will checkout that dev branch rather than folder named dev
.
So rather I would run
git checkout -- dev
Now this bare double dash stands for current branch. So above command is asking from git is that please give me 'dev' named folder from current branch.
Lets talk about your use case.
git checkout branch
this command will simply checkout the branch named 'branch'
git checkout branch .
The second command will tell git that please checkout .
or current folder name from the branch named 'branch'
git checkout . #<-- used at the branch
as you are saying first you switched to branch named 'branch' using git checkout branch
then you are simply doing git checkout .
Now there is no branch named .
so it will simply pull down current folder name from current branch.
Upvotes: 21