我们创建的 learngit 文件夹就是一个工作区

工作区有一个隐藏目录 .git,这个不算工作区,而是Git的版本库。可以用 ls -al 查看
ls -altotal 8
drwxr-xr-x    4 vien  staff   128 Oct 18 12:31 .
drwxr-xr-x+ 119 vien  staff  3808 Oct 18 13:07 ..
drwxr-xr-x   13 vien  staff   416 Oct 18 13:07 .git
-rw-r--r--    1 vien  staff    27 Oct 18 12:24 README.mdGit版本库存了很多东西,其中最重要的是被称为stage或者index的暂存区,还有Git为我们自动创建的第一个分支:master分支,以及指向master的一个指针HEAD。

现在我们可以详细理解一下之前的 add 和 commit 命令了。我们在执行git add的时候,实际只是把文件修改添加到暂存区;在执行git commit 提交更改的时候,才会把暂存区的内容提交到当前分支。
当你刚clone了一个项目的时候,你的master分支的内容,跟暂存区的内容,以及你的工作区的内容呢是一样。
当你修改了一个文件,那么你的工作区内容发生了变化,Git会发现这个变化(Git说:哦有东西被修改了),并且标记这些变化。
当你修改后执行了git add那么修改的内容被添加到暂存区,也就是工作区和暂存区是一样的了,且跟master不一样,只有master没变。
当年你又执行了git commit那么暂存区的内容被提交到master了,这时候,工作区、暂存区、master分支三个地方都一样了,都是修改后的内容。
之前在讲git reset的时候并没有说--hard是干嘛用的,或许大家还心存疑惑,现在了解了Git工作区、暂存区、master分支以及HEAD指针的概念之后,我们详细来说一下git reset这个命令。
它有三个参数soft, mixed, hard。我是按顺序写的,什么顺序呢?令人发指的程度!哈哈~
soft, 只回退当前分支的内容,也就是说工作区和暂存区不会变,只有master分支被修改了。对应的等级是git commit的等级,git add的并不会变。mixed,默认的参数。回退当前分支以及暂存区内容,也就是说只有工作区修改不变,master分支和暂存区都回退了。对应的是git add的等级。hard,全部回退!是不是令人发指,如果不小心用了这个命令,那么恭喜你,辛辛苦苦写在工作区的代码全没了,直接回退到指定的版本了,当然,如果你确实也不想要工作区修改的内容了,那就没关系了。其实平常,直接git reset 版本号就好,也就是使用默认的mixed参数,除非有特殊需求,真的工作区修改都不要了,才会加hard参数。况且git checkout 也可以做一部分回退工作区的任务。