4.啥事工作区、暂存区和版本库

小白的故事

本故事纯属虚构,如有雷同,^0^那可太巧了

回到家的小白,想着今天发生的事,为什么git status出来的提示信息不一样?为什么git status出来的提示信息不一样?为什么git status出来的提示信息不一样?
想着想着他就睡着了,梦里他遇到了linus大神,linus带他来到了一个神秘的机构。在这个房间里有2个人,还有一个大大的大屏幕。
每次大屏幕上显示git add,就会有一份文件到达一个人的手里,他会把信息进行整理。当大屏幕上显示git commit。第一个人就会把整理的内容放到第二个人的桌子上,然后回来继续工作。

小白疑惑的看向linus大神,大神和蔼的告诉他“小白,你不是一直奇怪,为什么git status出来的提示信息不一样?”,这就是你要的答案。

小白仔细打量着房间里的一切,第一个人的办公桌上有一个牌子,上面写着”stage”。
第二个人的办公桌上同样有一个牌子,上面写着”HEAD”。

小明若有所思,抬起头的时候,发现linus大神已经不见了。他冲出房门,发现街上根本没有大神的踪影,只有房子上高高挂起的牌匾写着”版本库”三个打字。

他大声的呼喊,这时耳边传来“叮铃铃叮铃铃”的响声。

小明从梦中醒来一看,哇,还有半小时就八点60了,飞快起身,背上背包冲向公司。

距离上班还有1秒钟的时候,小白打卡成功。

打开电脑,想起昨天遇到的情形,好像自己明白了什么,到网上一查,原来如此。

git是分为工作区和版本库的。代码发生更改后,执行git add代码会放到代码库的暂存区(stage),当执行git commit时代码会形成版本记录(HEAD),并且删除暂存取的记录。

当我们执行git status时,git会将工作区(当前的代码)与暂存区的记录进行比较,如果暂存区没有记录,则会跟做过记录的版本作比较。从而提示你哪个文件发生过修改。

明白了这些,小白开始反思昨天看到的提示。

1
2
3
4
5
6
7
8
9
10
11
$ git status
On branch master

No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)

我最帅.txt

nothing added to commit but untracked files present (use "git add" to track)

Untracked files列出的是新建的文件,还没有被add和commit过,所以提示你(use "git add <file>..." to include in what will be committed),这表示需要进行git add操作

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.md

no changes added to commit (use "git add" and/or "git commit -a")

Changes not staged for commit列出被修改的文件,这时候文件还没有被add和commit。这时就是比较工作区和HEAD得出的结果。modified: readme.md意思是这个文件发生了更改。

了解了不同提示的原因,小白果断git add git commit开始开发新功能。

小结

git是分为工作区和版本库的。代码发生更改后,执行git add代码会放到代码库的暂存区(stage),当执行git commit时代码会形成版本记录(HEAD),并且删除暂存取的记录。工作区可以简单理解为项目目录,每次项目更改都会记录,这些变更记录就是版本库。

下面是各种状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
git status
On branch master

# 已经执行过`git add`但没有执行`git commit`
Changes to be committed:
# 可执行的命令,reset会移除暂存区记录,移除后需要重新进行add
(use "git reset HEAD <file>..." to unstage)

renamed: 我最帅.txt -> wo.txt

# 文件发生修改时提示
Changes not staged for commit:
# 可以执行的命令,文件修改是可以执行add加入到暂存区,也可以checkout进行撤销
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.md

# 新增文件时提示
Untracked files:
# 可以执行的命令,新增文件只要add到
(use "git add <file>..." to include in what will be committed)

我很帅.txt

no changes added to commit (use "git add" and/or "git commit -a")