|
[md]
感谢 [coding.《使用原理视角看 Git》](https://blog.coding.net/blog/principle-of-Git)
# 2. Git 原理
* 工作区
* 暂存区
* 本地仓库
## 2.1 快照
如其所说,保存的是文件快照。在.git/objects
用` git hash-object <file> `可以计处出文件的 sha-1 值,
> 我们可以看到,在 objects 目录下,存放了很多文件,他们都使用 sha-1 的前两位创建了文件夹,剩下的38位为文件名。我们先称呼这些文件为 obj 文件。
>对于这些 obj 文件,其实分为四种类型,分别是 blob、tree、commit、tag。
## 2.2 暂存区
> 暂存区是一个文件,路径为: .git/index
可以用 `git ls-files --stage` 查看其中的内容
第二列就是sha-1 hash值,相当于内容的外键,指向了实际存储文件内容的blob。第三列是文件的冲突状态,这个后面会讲,第四列是文件的路径名。
## 2.3 文件状态
暂存区|本地仓库|sha-1|文件状态
-|-|-|-
√|√|×|modified
×|√|-|removed
√|×|-|added
工作区|暂存区|sha-1|文件状态
-|-|-|-
√|√|×|modified
×|√|-|missing
√|×|-|untracked
## 2.4 分支
```
cat .git/HEAD
=>ref: refs/heads/master
```
```
cat .git/refs/heads/master
=> 2b388d2c1c20998b6233ff47596b0c87ed3ed8f8
```
```
git cat-file -p <object>
```
指向一个 commit
# 3. 高层命令
### 3.3.3 Reset
```
--mixed reset HEAD and index
--soft reset only HEAD
--hard reset HEAD, index and working tree
--merge reset HEAD, index and working tree
--keep reset HEAD but keep local changes
```
>soft 仅修改分支指向(HEAD),不修改暂存区(index)和工作区(working tree);
>mixed 会修改分支指向和暂存区;
>hard 会修改分支指向,暂存区和工作区
## 3.5 bisect
* git bisect start
* git bisect (bad|new) [<rev>]
* git bisect (good|old) [<rev>...]
* ...
* git bisect reset [<commit>]
[/md]
|
|