Git 工作区、暂存区和版本库
基本概念
- 工作区:即在电脑中能直接看到的目录。(非隐藏文件夹)
- 暂存区:英文叫 stage 或 index。一般存放在 (.git) 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录
.git
,这个不算工作区,而是 Git 的版本库。
其他的一些小概念 (背单词)
- Untracked files:没有被暂存的文件
- Modified:修改过的
- staged:暂存的
一些小技巧
git add .
将工作区中新增、修改过的文件都加入到暂存区中
工作区、暂存区和版本库之间的关系图
- 图中左侧为 工作区,右侧为 版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。(master是主分支)
- 图中的 objects 标识的区域为 Git 的对象库( 说白了就是存文件的地方 ),实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行
git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。 - 当执行提交操作
git commit
时暂存区 的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。 - 当执行
git rm --cached <file>
命令时,会直接从暂存区中删除指定文件,工作区则不做出改变。 - 当执行
git restore --staged <file>
将文件从暂存区撤出,不会修改工作区中的文件 - 当执行
git restore <file>
将工作区的指定文件覆盖成暂存区中的版本,且不修改或删除暂存区的文件 - 当执行
git checkout .
或者git checkout -- <file>
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
git rm --cached <file>
和git restore --staged <file>
有什么区别啊? 都是从暂存区撤出,工作区不修改?git rm --cached <file>
会将之前 commit 过的文件从 master 主分支中删除,但是git restore --staged <file>
只会将之前 add 到暂存区但还没有将这些文件 commit 的文件从暂存区撤出