我们创建的 learngit
文件夹就是一个工作区
工作区有一个隐藏目录 .git
,这个不算工作区,而是Git的版本库。可以用 ls -al
查看
ls -al
total 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.md
Git版本库存了很多东西,其中最重要的是被称为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
也可以做一部分回退工作区的任务。