工作区
Git和其他版本控制SVN的一个不同之处就是有暂存区(stage)的概念.
工作区(Working Directory)
就是你在电脑里能看到的目录,比如learngit
文件夹就是一个工作区
版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库
Git的版本库里存了很多东西,其中最重要的称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
- 第一步用
git add
把文件添加进去,实际上就是把文件从工作区添加到stage(暂存区)中 - 第二步用
git commit
提交更改,实际就是把暂存区的所有内容添加到当前分支中
因为我们创建Git版本库时,Git自动为我们创建了唯一一个的Master
分支,所以,现在git commit
就是把stage
区的内容往Master
分支上提交更改
可以简单理解为,需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改
现在依次添加修改readme.txt
和新增一个LICENSE.txt,随意修改内容并通过
git add`添加到暂存区中
现在暂存区变成如下情况
所以git add
实际就是把工作区要提交的文件提交到stage
暂存区中,然后执行git commit
便可一次提交到分支上
一旦commit
后,如果你又没有对工作区有任何修改,那么工作区就是“干净”的
小结
暂存区是Git非常重要的概念,弄明白了暂存区,就间接明白了Git很多操作到底干了什么
撤销修改相关
git checkout –file 的使用
若如不小心把文件修改了仍未提交到暂存区,这时可先使用git status
查看当前状态
然后通过git checkout --file
撤销工作区的保存
命令git checkout -- readme.txt
就是把文件在工作区中的修改全部撤销,这里有两种情况
- 一种是
readme.txt
自修改后还没备放到暂存区(即工作区内unstage),现在可撤销修改回到版本库一模一样的状态。 - 一种是
readme.txt
已添加到暂存区(stage)中,又作了修改。现在撤销修改就可以回到添加到暂存区后的状态
总而言之,这是一个让这个文件回到最近一次git commit
或git add
时的状态
git reset HEAD file 的使用
命令git reset
既可退回版本,也可以把暂存区的修改回退到工作区,当我们使用HEAD
时,表示最新版本
此时再使用
$ git reset HEAD <file>
可将stage区的文件回退到工作区
小结
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,使用命令git checkout --file
。或者使用git checkout .
删除所有未提交到stage中的文件
场景2:当你改乱了工作区某个文件并且已经添加到stage(暂存)区时,可使用命令git reset HEAD <file>
让文件回退到unstage(工作区)中
场景3:已经提交了不合适的修改到版本库时,此时只能使用版本回退,不过前提是没有push到远程仓
删除文件
Git中,删除也是一个修改操作。假设先添加一个新文件test.txt到git中并提交。
$ git add test.txt
$ git commit -m"desc"
$ git status
此时查看Git status显示clean
此时使用rm test.txt
可观察到status
中显示了被删除的文件(注意:如果是在工作区未添加到暂存或分支的文件,即使删除了也不会显示)
接下来再次使用 git checkout --file
,文件又回来了
小结
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”.rm file
用于删除一个文件,如果一个文件已经被提交到版本库,那么你永远不用担心误删。但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容.