# 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回退上一个commitreset回退到指定commit
# 代码暂存
当我们在当前分支工作时,不得已需要切换到其他分支处理事情而不想 commit 时,可以使用 git stash 将那些数据都暂存到 Git 提供的栈中