git 入门教程之基本概念
基本概念
了解工作区,暂存区和版本库的区别和联系有助于我们更好理解 git
的工作流程,了解命令的操作意图.
git
和其他版本控制系统如svn
的不同之处就是有暂存区的概念.
基本概念
- 工作区 | Working Directory
正常情况下能看到的目录(不包括隐藏文件),也就是用户主动创建的目录
- 暂存区 | Stage
工作区下的隐藏.git
目录下的.index
文件,因此也称为索引.
- 版本库 | Repository
工作区下的隐藏目录.git
目录
通过前几节我们知道,将文件纳入版本控制,需要分两步操作:
- 第一步
git add
添加文件,实际上是将文件更改添加到暂存区. - 第二步
git commit
提交更改,实际上是将暂存区所有内容提交到当前分支.
我们使用 git init
命令初始化创建 git
仓库时,git
会自动创建唯一一个 master
分支,默认所有操作是在 master
分支上进行的,所以 git commit
就是徃 master
分支上提交更改的.
通俗地讲,文件更改可以多次添加到暂存区,即允许多次执行 git add
命令,然后一次性提交暂存区的全部更改到版本库,即只需要执行一次 git commit
命令即可.
说说个人理解 git
为何分成三部分进行版本控制操作,二部分行不行?
答案是肯定的,没有暂存区概念的 svn
同样可以进行版本控制,所以 git
增加暂存区必然是有存在的意外也就是所谓的好处的.
第一,暂存区的概念允许将本地文件的更改添加进来,也就是说本地文件的更改只有添加到暂存区才能进行下一步的提交更改,所以说那些更改添加到暂存区是由开发者本人决定的,这其实有了一定灵活性,并不是所有的更改都需要被记录!
第二,暂存区作为中间过程,暂存区的内容是打算提交更改的内容,也就是说暂存区可以视为一种临时缓存,用来记录预提交更改.实际工作中,新功能的开发并不是一蹴而就的,是由一系列的更改一起组成的,如果将这些更改分散开来单独提交,那势必会产生很多commit
,如果等待全部工作完成再提交的话,解决了过多commit
的问题,但是又遇到新问题就是你可能很长时间才能提交一次更改,失去了版本控制的意义.综上所述,暂存区的出现一种很好的解决方案,它允许将相关性代码添加在一起,方便后续提交更改时提交的都是相关性代码!
第三,作为分布式版本控制系统,不像集中式控制系统那样,对网络强相关,失去网络的 svn
是没办法再进行版本控制的,但失去网络的 git
仍然可以进行版本控制,只不过不能远程操作了而已,不过这部分也是无可厚非的,正所谓"巧妇难为无米之炊",你总不能要求断网下继续访问百度吧!
好了,我们继续回到 git
常用操作上,看一下工作区,暂存区和版本库三者如何协同工作的.
首先,先修改test.txt
文件.
# 查看 test.txt 文件内容
$ cat test.txt
git test
git init
git diff
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 <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
.DS_Store
newFile.txt
no changes added to commit (use "git add" and/or "git commit -a")
$
从输出结果中得知,test.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 committed:
(use "git reset HEAD <file>..." to unstage)
new file: newFile.txt
modified: test.txt
Untracked files:
(use "git add <file>..." to include 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] understand how stage works
2 files changed, 2 insertions(+)
create mode 100644 newFile.txt
$ git status
On branch master
Untracked files:
(use "git add <file>..." 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
文件时再处理.
图解
下图展示了工作区,暂存区,版本库之间的关系:
图中左侧是工作区,右侧是版本库,版本库中标记index
的区域是暂存区,标记 master
的是 master
分支所代表的目录树.
HEAD
是指向 master
分支的指针,标记 objects
的区域是 git
的对象库,真实路径位于.git/objects
目录下,用于表示创建的对象和内容.
意图说明
git add
添加文件
工作区的修改或者新增的文件执行git add
命令后,暂存区(index)的目录树会自动更新,同时引发这次变化的文件内容会被记录下来,即生成对象库(objects)中的新对象,而对象的 id会被记录到暂存区的文件索引(index)中.
git commit
提交文件
暂存区的目录树写入到对象库(objects),master
分支的目录树自动更新.
git reset HEAD
撤销文件
暂存区的目录树被重写,被master
分支的目录树所替换,但是工作区不受影响.
git rm --cached <file>
删除缓存文件
删除暂存区文件,工作区不受影响.
git checkout .
检出文件
暂存区的文件替换工作区文件,注意:当前尚未添加到暂存区的改动会全部丢失!
git checkout HEAD .
检出文件
HEAD
指针指向的 master
分支中的文件替换暂存区以及工作区文件,注意:不仅清除工作区未提交的改动,连暂存区未提交的改动也会被清除!
小结
以上就是常用命令的背后意图,主要是工作区,暂存区和版本库之间文件同步策略的关系.
git add
是工作区更新到暂存区git commit
是暂存区更新到版本库git reset HEAD
是版本库更新到暂存区git checkout -- <file>
是暂存区更新到工作区git checkout HEAD <file>
是版本库同时更新暂存区和工作区git rm --cached
清空暂存区
git 入门教程之基本概念的更多相关文章
- git 入门教程
git 入门教程之协同开发 前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协 ...
- 廖雪峰Git入门教程
廖雪峰Git入门教程 2018-05-24 23:05:11 0 0 0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...
- git 入门教程之远程仓库
远程仓库 如果说本地仓库已经足够个人进行版本控制了,那么远程仓库则使多人合作开发成为可能. 如果你只是打算自己使用git,你的工作内容不需要发布给其他人看,那就用不到远程仓库的概念. git 是分布式 ...
- git 入门教程之版本控制
版本控制 我们知道 git 是分布式版本控制系统,所以称被控制对象是版本本身没错,但是从git 命令中发现,并没有版本这个名词,有的只是commit,所以前几节我一直称其为提交. 为了避免后续教程引发 ...
- Git入门教程,详解Git文件的四大状态
大家好,欢迎来到周一git专题. git clone 在上一篇文章当中我们聊了怎么在github当中创建一个属于自己的项目(repository),简称repo.除了建立自己的repo之外,我们更多的 ...
- Git入门教程
参考文献: 1. Pro Git 2. Git教程 3. Git教程 4. 图解Git
- 深入学习:Windows下Git入门教程(下)
声明:由于本人对于Git的学习还处于摸索阶段,对有些概念的理解或许只是我断章取义,有曲解误导的地方还请见谅指正! 一.分支 1.1分支的概念. 对于的分支的理解,我们可以用模块化这个词来解释:在日常工 ...
- 深入学习:Windows下Git入门教程(上)
一,安装Git: 1.1Linux上安装命令: sudo apt-get install git 1.2在Windows上安装Git: 使用Windows版的msysgit,官方下载地址:http:/ ...
- git 入门教程之里程碑式标签
"春风得意马蹄疾,一日看尽长安花",对于项目也是如此,最值得期待的恐怕就要数新版本发布的时刻了吧?每当发布新版本时要么是版本号命名(比如v0.0.1)或者代号命名(比如Chelse ...
随机推荐
- 运维笔记--docker odoo镜像 运行异常处理
场景描述: 镜像来源,dockerhub odoo官方镜像:https://hub.docker.com/_/odoo odoo镜像运行一段时间后,出现下述异常,可能是触发某个未知bug:该现象在生产 ...
- mysql 开发基础系列16 视图
一. 什么是视图视图是一种虚拟存在的表,行和列数据来自,定义视图的查询中使用的表,并且是在使用视图时动态生成的.优势有: 简单: 使用视图的用户完全不需要关心后面对应的表的结构,关联条件,筛选条件. ...
- selenium python 一些操作和定位收集
(—)滚动条操作 python中selenium操作下拉滚动条方法汇总 selenium_webdriver(python)控制浏览器滚动条 selenium+Python(select定位) Sel ...
- Spring Security + OAuth系统环境搭建(一)
最近在做权限管理系统的重构工作,系统基于Spring Security + OAuth架构,整体架构.技术和之前调研的结果差不多,架构调研时有在这篇博客做过简单记录“Spring Cloud微服务下的 ...
- Netty源码分析(一):Netty总览
作为当前最流行的网络通信框架,Netty在互联网领域大放异彩,本系列将详细介绍Netty(4.1.22.Final). 代码事例 服务端 public final class EchoServer { ...
- 【原创】ucos信号量的操作及原理
信号量的操作及原理 1.OSSemCreate创建信号量semaphore 在使用信号量之前,要先用OSSemCreate创建一个信号量,并通过返回的合法事件结构体指针使用信号量. OS_ ...
- Go语言学习笔记说明
参考书籍:<学习Go语言>.<Go语言编程> 程序运行环境:windows(64bit) Go语言版本:go1.0.2 资料: 1.Go语言半小时速成教程 http://w ...
- javascript小实例,编写一个方法,实现从n-m个数中随机选出一个整数
别怪我是一个闷葫芦,没那么多花哨的语言,废话不多说,先说说小实例的要求: 编写一个方法,实现从n-m个数中随机选出一个整数,要求:传递的参数不足两个或者不是有效数字,返回[0-1]之间的随机数,需要解 ...
- TensorFlow.js入门(一)一维向量的学习
TensorFlow的介绍 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着 ...
- 结构型---组合模式(Composite Pattern)
组合模式的定义 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合. 组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口 ...