# git 基本概念和使用
# 分区
- 工作区
Working Directory
: 直接编辑的区域 - 暂存区
stage or index
: 数据暂时存放的区域,数据进入本地代码仓库之前存放的区域(存放在.git/index
中) - 版本库,也叫本地仓库
commit History
# 分区转换指令
git add
工作区 -> 暂存区git commit
暂存区 -> 版本库git push
版本库 -> 远程仓库

# 分区对比指令
git diff
工作区 -> 暂存区git diff head
工作区 -> 版本库git diff --cached
暂存区 -> 版本库

# 原理
git init
初始化会创建 .git
目录:
└── .git
├── HEAD
├── config
├── description
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── prepare-commit-msg.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
其中 objects
目录是存储文件变化的核心,里面存放的文件名是根据 SHA1
计算得到,文件内容就是压缩后的二进制文件
Object
有三种类型:
Blob
: 文件Tree
: 文件夹Commit
: 提交节点

# 分支
.git
├── ......
├── HEAD
└── refs
├── heads
│ └── master
├── remotes
│ └── origin
│ └── HEAD
└── tags
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
heads
记录本地所有分支remote
记录远程分支
分支当前指针指向最近一次 commit
注
未被 commit
的文件(未放入版本库)切换分支时会被抛弃
# 合并分支
merge
: 解决冲突后会创建一个新的commit
,保留之前的commit
记录rebase
: 修改branch out
位置,之前在最近节点合并之前commit
# 版本回滚
revert
回退上一个commit
reset
回退到指定commit
# 代码暂存
当我们在当前分支工作时,不得已需要切换到其他分支处理事情而不想 commit
时,可以使用 git stash
将那些数据都暂存到 Git
提供的栈中