首页 微博热点正文

基本概念

了解作业区,暂存区和版别库的差异和联络有助于咱们更好了解 git 的作业流程,了解指令的操作目的.

git 和其他版别操控系统如 svn 的不同之处便是有暂存区的概念.

基本概念

  • 作业区 | Wo张甲张乙张丙rking Directory

正常情况下能看到的目录(不包括躲藏文件),也便是用户主动创立的目录



working-directory.png

  • 暂存区 | Stage

作业区下的躲藏.git目录下的.index文件,因而也称为索引.

  • 版别库 | Repository

作业区下的躲藏目录.git目录



repository.png

经过前几节咱们知道,将文件归入版别操控,需求分两步操作:

  • 榜首步 git add 圣里亚娜增加文件,实践上是将文件更改增加到暂存区.
  • 第二步 git commit 提交更改,实践上是将暂存区一切内容提交到当时分支.

咱们运用 git init 指令初始化创立 git 库房时,git 会主动创立仅有一个 master 分支,默许一切操作是在 master 分支上进行的,所以 git commit 便是徃 丑女大翻身,git 入门教程之基本概念,蓝思科技master 分支上提交更改的.

浅显地讲,文件更改能够屡次增加到暂存区,即答应屡次履行 git 魁岐佳园add 指令,然后一次性提交暂存区的悉数更改到版别库,即只需求履行一次 git commit 指令即可.

说说个人了解 git 为何分红三部分进行版别操控操作,二部分行不可?

答案是必定的,没有暂存区概念的 svn 相同能够进行版别操控,所以 git 增加暂存区必定是有存在的意外也便是所谓的优点的.

榜首,暂存区的概念答应将本地文件的更改增加进来,也便是说本地文件的更改只需增加到暂存区才干进行下一步的提交更改,所以说那些更改增加到暂存区是由开发者自己决议的,这其实有了必定灵活性,并不是一切的更改都需求被记载!

第二,暂存区作为中心进程,暂存区的内容是计划提交更改的内容茗景堂,也便是说暂存区能够视为一种暂时缓存,用来记载预提交更改.实践作业中,新功能的开发并不是一蹴即至的,是由一系列的更改一同组成的,假如将这些更改分散开来独自提交,那势必会发生许多commit,假如等姚家晴待悉数作业完结再提交的话,处理了过多commit的问题,可是又遇到新问题便是你或许很长时刻才干提交一次更改,失掉了版别操控的含义.综上所述,暂存区的呈现一种很好的处理方案,它答应将相关性代码增加在一同,便利后续提交更改时提交的都是相关性代码!

第三,作为分布式版别操控系统,不像张付川集中式操控系统那样,对网络强相关,失掉网络的 svn 是没办法再进行版别操控的,但失掉网络的 git 依然能够进行版别操控,只不过不能长途操作了罢了,不过这部分也是无可厚非的,正所谓"巧妇难为无米之炊",你总不能要求断网下持续拜访百度吧!

好了,咱们持续回到 git 常用操作上,看一下作业区,暂存区和版别库三者怎样协同作业的.

首要,先修正test.txt文件.

# 检查 test.txt 文丑女大翻身,git 入门教程之基本概念,蓝思科技件内容
$ cat test.txt
git test
git init
git d前锋不撸iff
understand how git control version
# 追加 how git work 到 test.txt 文件
$ echo "how git work" >> test.txt
# 再次检查 test.txt 文件内容
$ cat test.txt
git test
git init
git diff
understand how git control version
how git work
$

紧接着新建newFile.txt 并随意输入内容:

# 检查当时文件夹下悉数文件
$ ls .
file1.txt file2.txt file3.txt test.txt
# 创立新文件 newFile.txt
$ touch newFile.txt
# 再次检查当时文件夹下悉数文件
$ ls
file1.txt file2.txt file3.txt newFile.txt test.txt
# 输入 add newFile.txt 文件内容 到 newFile.txt 文件
$ echo "add newFile.txt" > newFile.txt
# 检查 newFile.txt 文件内容
$ cat newFile.txt
add newFile.txt
$

现在运转git status 指令检查当时文件状况:

$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be commi丑女大翻身,git 入门教程之基本概念,蓝思科技tted)
(use "git checkout -- ..." to discard changes in working directory)
modified:龙城风月 test.txt
Untr丑女大翻身,git 入门教程之基本概念,蓝思科技acked files:
(use产组词 "git add ..." to include in what will be committed)
.DS_Store
newFile.txt
no changes added to commit (use "git add" and/or "git commit -a")
$

从输出成果中得知,te中南陈锦石女儿陈昱含st.txt 文件已修正(modified),还没增加到暂存区,而newFile.txt 文件还没被盯梢(Untracked).

现在咱们运用git add 指令将 test.txt 和 newFile.txt 都增加到暂存区,再用 git status 检查文件状况:

# 增加 test.txt 文件
git add test.txt
# 增加 newFile.txt 文件
git add newFile.txt
# 检查文件状况
git status
On branch master
Changes to be com七爷乌溪肉mitted:
(use "git reset HEAD ..." to unstage)
new file: newFile.txt
modified: test.txt
Untracked files:
(use "git add ..." to includ棨怎样读e in what will be committed)
.DS_Store
$

现在输出成果和前次就不相同了,显现的是即将被提交文件,其间newFile.txt 是新文件(new file),test.txt 是修正文件(modified).

所以,git add 指令作用是将需求提交的更改文件暂时放到暂存区中,然后履行git commit 指令就能够一次性将暂存区的一切内容提交到当时分支.

$ git commit -m "understand how stage works"
[master a5cd3fb]丑女大翻身,git 入门教程之基本概念,蓝思科技 unde只需你姜宁rstand how stage works
2 files changed, 2 insertions(+)
create mode 100644 newFile.txt
$ git status
On branch master
Untracked files:
(use "git add ..." to include in what will be committed)
.DS_Store
nothing added to commit but untracked files present (use "git add" to track)
$

暂存区的一切内容提交到版别库,所以运转git status 时,作业区是洁净的,即此刻暂存区没有内容了!

.DS_Store 是 mac 电脑主动生成的文件,能够暂不理睬,比及后边的.gitignore 文件时再处理.

图解

下图展现了作业区,暂存区,版别库之间的联系:



relationship.jpg

图中左边是作业区,右侧是版别库,版别库中符号i丑女大翻身,git 入门教程之基本概念,蓝思科技ndex 的区域是暂存区,符号 master 的是 master 分支所代表的目录树.

HEAD 是指向 master 分支的指针,符号 objects 的区域是 git 的目标库,实在途径坐落.git/objects目录下,用于表明创立的目标和内容.

目的阐明

  • git brewistaadd 增加文件

作业区的修正或许新增的文件履行卡布西游水帘洞石碑答案git add 指令后,暂存区(index)的目录树会主动更新,一起引发这次改变的文件内容会被记载下来,即丑女大翻身,git 入门教程之基本概念,蓝思科技生成目标库(objects)中的新目标,而目标的 id会被记载到暂存区的文件索引(index)中.

  • git commit 提交文件

暂存区的目录树写入到目标库(objects),master 分支的目录树主动更新.

  • git reset HE竹山天气预报AD 吊销文件

暂存区的目录树被重写,被master 分支的目录树所替换,可是作业区不受影响.

  • git rm --cached 删去缓存文件

删去暂存区莫名塘文件,作业区不受影响.

  • git checkout . 检出文件

暂存区的文件替换作业区文件,留意:当时没有增加到暂存区的改动会悉数丢掉!

  • git checkout HEAD . 检出文件

HEAD 指针指向洗灌屋的 master红召九龙湾 分支中的文件替换暂存区以及作业区文件,留意:不只铲除作业区未提交的改动,连暂存区未提交的改动也会被铲除!

小结

以上便是常用指令的背面目的,主要是作业区,暂存区和版别库之间文件同步战略的联系.

  • git add 是作业区更新到暂存区
  • git commit 是暂存区更新到版别库
  • git reset HEAD 是版别库更新到暂存区
  • git checkout -- 是暂存区更新到作业区
  • git checkout HEAD 是版别库一起更新暂存区和作业区
  • git rm --cached 清空暂存区
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。