为了真正了解git,我们从底部、底层开始,了解git核心,知其然并知其所以然。
为什么要进行版本控制呢? 因为编写文件不可能一次到位,文件总是有不同的状态需要保存下来,方便以后出错回滚。
git 是目前最先进的版本控制软件(VCS,version control system),它是linux之父Linus Torvalds的第二个作品。
正如git所命名的那样,是“愚蠢或不开心的人”,Linus评价“git is a British English slang for a stupid or unpleasant person.”
而且他认为git是一个简化的文件系统,版本控制只是它的一个功能,并不是全部。“In mang ways you can just see git as a filesystem-it’s content –addressable,and it has a notion of versioning ,but I really designed it coming at the problem from the viewpoint of a filesystem person(hey,kernels is what I do),and I actually have absolutely zero interest in creating a traditional SCM system.”
VCS的主要发展进程: CVS(Concurrent Version System)---SVN(subversion)--git
“Git is at it’s heart very stupid simple.”底层简单,但抓住了本质,功能强大
一个简化的文件系统,文件只保存一份,传统的是两份
/c/user:可以看到省去了冒号
pwd:在Linux层次结构中,想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名。
git –version 显示版本,说明已经安装好
inux中 ls-ltr:对输出文件进行各种排序;
按照字符序(default): #ls -l
按照修改时间排序: #ls -t //最近修改在最上面
逆排序 : #ls –r
ls 命令将每个由 Directory 参数指定的目录或者每个由 File 参数指定的名称写到标准输出,以及您所要求的和标志一起的其它信息。如果不指定 File 或 Directory 参数, ls 命令显示当前目录的内容。
传统的CVS,SVN的储存如下图所示:
若想取得版本四的所有文件:
A+点他1+点他2
B+点他1
C+点他1+点他2
节省了磁盘空间,加大了计算量,性能下降
snapshot
n. (快照) 照片,独立的印象,简单印象; 简介; 急射,速射;
vt. 给…拍快照;
vt. 拍快照;
A1,A2等都是独立的文件
恰恰相反,这种方式是高效的,为了节省磁盘空间,用zip压缩
Version3,A1不变,保存个指针指向A1,牺牲磁盘上的开销,提高了性能
Metadata:元数据 包括三个方面:内容(字节序列),文件名name,大小size,(访问权限等)
创建文件非常简单 ,复制后改变文件名,在磁盘上存的是两个文件,这显然不是一种很好的存储方式。可不可以一个文件取两个名字?提到这是为了以后说明git和文件系统的区别。
File version 文件版本:对文件后进行修改,变成第二个状态,第二个文件版本。希望两种状态都保存下来,方便回溯。如果没有的话,总是需要clone,很麻烦。
同一个文件,多种状态,如何保存?
多种状态,有很多内容重复。保存f1,保存f2与f1的区别、(差、变化)(svn),类似f3与f2的差
F1,f2都保存下来(git,很傻、拙劣的一种方式,但有它背景,磁盘越来越便宜,带来了很多优点,在实践中是一种很优秀的方法)
Hash:哈希 输入是一个文件,经过一个函数变化,产生一个固定长度的字节fixed length
主要流行的两种:MD5,渐渐淘汰,一个(山东,清华女)教授破解了它;SHA1,20个byte,160个bit,理解为文件的指纹。文件变化,指纹也发生了的变化。单向的,难以从字节反推出文件
创建一个git.txt
sha1 git.txt 会得到20个字节
改动git
Sha1 git.txt 20个字节改变
(1)安装
git安装之类的十分简单,具体过程我们不再赘述,直接进行应用。
查看git版本,验证git已经成功安装:
(2)git初始化
在d:/temp/gitdemo/aaa下创建一个文件main.c,并将目录aaa作为git仓库:
(可以用mkdir先将目录建立出来)
在main.c中编辑内容
所有 git 需要的数据和资源都存放在.git目录中
(3)配置用户名和密码
每次git提交都会使用该信息,因为传递了 --global 选项,所以git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global选项。
Git有三种配置
在.git目录下有config文件,