版本控制Git(1)——理解暂存区
一、svn和Git的比较
我们都知道传统的源代码管理都是以服务器为中心的,每个开发者都直接连在中间服务器上, 本地修改,然后commit到svn服务器上。这种做法看似完美,但是有致命的缺陷。
1. 开发者不能本地跟踪代码版本。 所有的信息都是在服务器上。 你把本地的代码改了很多,但是又不能提交。通常,本地只能缓存一个版本。对于小项目无所谓, 但是项目一复杂,人员多就麻烦了。 通常你本地的代码都全是红色的。自己都不知道今天修改了什么, 有哪些修改是真正应该提交给svn的。
2. 因为第一点,一旦离开服务器, 程序猿将无法正常工作。 因为本地不能跟踪代码版本。 你的(几乎)任何操作都必须连上服务器。比如, show log, blame,show history等等。
3. 中央服务器压力过大。 因为每个人都必须把代码提交到服务器,并且做daily build。
4. 对于大型项目, svn几乎不可用。 例如linux内核项目, 开发者何止几万? 都直接提交给svn服务器的话还不乱套了。
5. 对于个人的私人项目而言(或者对于小公司的项目), 不用版本控制当然不行,但是为了用版本控制而专门架设svn服务器有有点舍不得。
有没有能解决上述几个问题的东东呢? 恩, 答案是肯定的。
Linux内核的作者也遇到了这些问题,于是他决定再一次改变世界, 重写一个可以本地使用的svn。
如上图,就是一个典型的Git的实际生产环境,开发者之间通过 pull和push操作, 把别人的修改拉过来,或者把自己的修改推给别人。接下来我们来详细研究一下Git的过程。
二、Git的安装
Linux下安装:shell下输入sudo apt -get install git-core,按下回车后输入密码,即可完成Git的安装。
Windows下安装:先从组织SVN库的项目级标准工作环境目录中,获取Git安装包Git-1.9.5-preview20141217.exe,完成安装。
Windows上Git是可以在图形界面上进行操作的,但是不建议这么做,Git的各种命令才是你应该掌握的,并且不管你在哪个操作系统中,使用命令操作Git肯定都是通用的。
Linux系统,打开shell界面。Windows系统,打开Git Bash。
Mac OS系统:
下载地址:https://code.google.com/p/git-osx-installer/
我早已为大家下载好了,不用FQ去下载。下载地址:http://download.csdn.net/detail/lxq_xsyu/8430713
安装好后重启控制台,执行 git --version
lixiaoqiangdeMac-mini:Documents lixiaoqiang$ git --version
git version 1.9.3 (Apple Git-50)
三、配置身份
配置身份,git config命令如下:
还可以配置开启颜色显示
git config --global color.ui true
配置了身份后,我们提交代码时Git就可以分辨是谁提交的了。
配置完成后,可以用同样的命令(去掉最后的名字和邮箱)来查看是否配置成功.
下面我们先通过两个命令删除上面的配置
创建一个版本库(用 git init -->创建文件-->改变文件内容->git add xxx->git commit -m "xxx")
可以看到在提交的时候会失败,提示我们设置用户名和邮箱,我们可以通过git config -e来查看配置文件
这三个分别是版本库级别配置文件、全局配置(用户主目录下)文件、系统配置文件(/etc目录下)
四、Git和其他版本管理系统的差异
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统 (CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,下图是其他版本管理系统的比较文件差异示意。
Git并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照 的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像下图。
五、Git文件的三种状态
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库 中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。
六、Git的暂存区理解
Git的三个基本操作、git init 、git add 和 git commit 就我们已经知道,可以通过git status 查看文件状态, git log --stat查看提交的文件的变更。
在我们创建版本库的时候会自动生成一个 .git文件夹内容如下:
文件.git/index实际上是一个包含了文件索引的目录树,就像一个虚拟的工作区,在这个目录树中记录了文件的状态信息(时间戳和文件长度等)。文件的内容并没有存储在其中,而是保存在Git对象库.git/objects目录中,文件索引建立了文件和对象库中实体之间的对应。
图中的objects就是Git的对象库,index是一个记录文件状态的暂存区,此时HEAD指向master分支的一个游标。
当我们执行 git add 命令的时候,暂存区的目录树将被更新,同时修改的文件内存会被写入Git的对象库objects中。
当我们执行 git commit 命令的时候,master分支会相应更新,master新指向的目录树就是提交时暂存的目录树。
当我们执行 git reset HEAD命令的时候,暂存区的目录树会被重写,会被master分支指向的目录树替换,但是不影响工作区。
当我们执行 git rm --cached <file>命令时,会直接从暂存区删除文件,工作区不改变。
当我们执行 git checkout . 或 git checkout -- <file> 时,会用暂存区的全部文件或指定文件替换工作区的文件。
当我们执行 git checkout HEAD . 或 git checkout HEAD <file>命令时,会用HEAD指向的master分支中的全部或部分文件替换暂存区和工作区中的文件。
版本控制Git(1)——理解暂存区的更多相关文章
- 理解git工作区和暂存区
版本库 在工作区目录中有一个.git文件,这个其实不是工作区而是Git的版本库 版本库中包含两个部分,一个是暂存区index/stage,另一个是git自动为我们创建的第一个分支master,以及一个 ...
- Git复习(九)之理解git工作区和暂存区
前言 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 版本库 在工作区目录中有一个.git文件,这个其实不是工作区而是Git的版本库 版本库中包含两个部分,一个是暂存区index/ ...
- git(工作区,暂存区,管理修改,撤销修改,删除文件)
工作区和暂存区 984次阅读 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的l ...
- Git工作区、暂存区和版本库
基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在 ".git目录下" 下的in ...
- Git 工作区、暂存区和版本库
基本概念 我们等来理解下Git工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录 强烈推荐git新手阅读 暂存区:英文叫stage,或index.一般存放在igt 目录下的index文件( ...
- Git-Runoob:Git 工作区、暂存区和版本库
ylbtech-Git-Runoob:Git 工作区.暂存区和版本库 1.返回顶部 1. Git 工作区.暂存区和版本库 基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电 ...
- Git 工作区、暂存区和版本库、操作流程
Git 工作区.暂存区和版本库 基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在 ".g ...
- 【第四篇】-Git 工作区、暂存区和版本库之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 工作区.暂存区和版本库 基本概念 我们先来理解下 Git 工作区.暂存区和版本库概念: 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫 stage 或 index.一般存放在 .git ...
- git工作区、暂存区、版本库之间的关系
区分三者关系 Git最让你迷惑的无非是它里面的各种概念了,如果是刚开始接触Git希望看完本篇介绍之后有一个清晰的认识,笔者认识也有限这里只说说个人对使用Git的感受,说一下它里面的几个最常用的概念的理 ...
随机推荐
- Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...
- hdu 1518 Square 深搜,,,,花样剪枝啊!!!
Square Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Objective-C的陷阱与缺陷
Objective-C是一个强大而且非常有用的语言,但是同样也是有一点危险的.这次主题是受到一篇有关C++陷阱的文章启发,来聊聊Objective-C和Cocoa中的陷阱. 简介 我将和Horstma ...
- Beat 'Em Up Game Starter Kit (横版格斗游戏) cocos2d-x游戏源代码
浓缩精华.专注战斗! 游戏的本质是什么?界面?养成?NoNo! 游戏来源于对实战和比赛的模拟,所以它的本源就是对抗.就是战斗! 是挥洒热血的一种方式! 一个游戏最复杂最难做的是什么?UI?商城? ...
- Android使用Fragment,不能得到Fragment内部控件,findViewById()结果是Null--已经解决
程序很easy.好长时间没有搞定.郁闷.... . .... . . . 在论坛咨询,最终找到答案. 描写叙述: 一个Activity:MainActivity.内部是一个Fragment:Fragm ...
- 兔子--Android Support v4包丢失的解决的方法
在开发中,Android Support v4包丢失的解决的方法: Project->properties->Java Build Path->Libraries->Add E ...
- P 值(p value)与统计检验
P 值是最常用的一个统计学指标,几乎统计软件输出结果都有P值. 统计学的观点,超过一定基准(比如 5%,其实是低于5%),就不能简单地认为这是偶然事件了,而是受到了外在的影响. 一般而言,为了确定从样 ...
- form表单系列中文件上传及预览
文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...
- Liunx-php7安装swoole扩展
Liunx-php7安装swoole扩展 标签(空格分隔): php 下载包 https://github.com/swoole/swoole-src/releases 安装过程 直接wget也行直接 ...
- JMeter使用碰到的问题
1.创建http请求 使用threadGroup-->add-->sampler--http request 2.使用计数器 使用threadGroup-->add-->con ...