hiahiahia我又来作恶了,莫名其妙的第八次实验还要更新!
一、Git
1.1 概述
1.1.1 Git
Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。Git易于学习,占地面积小,具有闪电般快速的性能。并且它超越了Subversion,CVS,Perforce和ClearCase等SCM工具,具有廉价的本地分支,便捷的临时区域和多个工作流程等功能。
1.1.2 分布式版本控制系统
Git具有分布式版本控制系统,它保存的是文件的完整快照,而不是差异变化或者文件补丁。每一次提交,Git保存的都是对项目文件的一个完整拷贝,因此开发者可以完全恢复到以前的一个提交而不会发生任何区别。这里容易让人疑惑的是,Git占用的空间会不会随着提交次数的增加而线性增加呢?比如项目大小是10M,提交了10次,占用的空间是不是100M呢?显然不是,如果文件没有变化,它只会保存一个指向上一个版本的指针,这就是说对一个特定版本的文件,Git只会保存一个副本,但可以由多个指向该文件的指针。
在《Pro Git》中,作者提到Git最适合保存文本文件(如各种语言的源代码,这也是Git设计的初衷),因为Git可以对文本文件进行很好的压缩和差异分析。但像二进制文件如视频、图片等,Git也能管理,但压缩比率低并且不能进行差异分析,Git占用的空间几乎随着提交的次数线性增长。
1.1.3 指令集
常见Git指令清单如下,注意git指令是大小写敏感的
1.2 版本控制系统
1.2.1 版本控制系统
版本控制系统是指能随时间的推进记录一系列文件以便于开发者以后想要回退到某个版本的系统,主要分为三类:本地版本控制系统、集中版本控制系统和分布式版本控制系统。
1.2.2 本地版本控制系统(Local Version Control Systems)
本地版本控制系统是指文件的各个版本以一定的数据格式存储在本地的磁盘中,这种方式在一定程度上解决了手动复制粘贴的问题,但是无法解决多人协作的问题。
1.2.3 集中版本控制系统(Centralized Version Control Systems)
集中版本控制系统与本地版本控制系统类似,但是多了一个中央服务器,各个版本的数据存储在中央服务器,管理员可以控制开发人员的权限,开发人员也可以从中央服务器拉去数据。这解决了LVCS没有解决的多人协作问题,但是由于数据集中存储,一旦服务器宕机或者磁盘损坏,会造成不可估量的损失。
1.2.4 分布式版本控制系统( Distributed Version Control System)
分布式版本控制系统与前两者均不同。首先,在分布式版本控制系统中,系统保存的不是文件变化的差量,而是文件的快照,即把文件的整体复制下来保存,而不关系具体的变化内容。其次,最重要的是分布式版本控制系统是分布式的,开发者从中央服务器拷贝下来代码时,拷贝的是一个完整的版本库,包括历史记录,提交记录等,这样即使某一台机器宕机也能找到文件的完整备份。
1.3 指针
Git从核心上看是简单地存储键值对,值为文件的内容,键为文件内容与文件头信息的40个字符长度的SHA-1校验和。Git使用校验和并不是为了加密,而是为了保证数据的完整性,这样即便要回退到一个很久之前的commit状态,也不会出现一丝差错。当对文件进行了哪怕一丁点儿的修改,也会计算出完全不同的SHA-1校验和。
SHA-1校验和即上面提到的文件的指针,与C语言指针不同,Git指针指向的文件内容发生变化时,指针行业会发生改变,这样每一个版本的文件,Git都有一个唯一的指针指向它。
1.4 三大工作区域
-
工作目录是当前进行工作的区域,文件修改但未提交,处于已修改状态(modified);
-
暂存区域是运行git add命令后文件保存的区域,也就是下次提交要保存的文件,文件处于已暂存状态(staged);
-
本地仓库即版本库,记录了工程提交的完整状态和内容,文件处于已经提交状态(committed)。
使用Git的工作流程基本就是文件在三个工作区域之间的流动。
1.5 三大对象
- commit:commit相当于一个顶层目录,指明了修改时间点项目快照的顶层tree对象、作者信息等,注意除了第一次的commit对象,每个commit对象都有一个指向上一次commit对象的指针。
- tree: tree对象类似于操作系统的目录,一个tree对象包含多个指向blob对象和tree对象的SHA-1指针,并包含对象的权限模式、类型和文件名信息等。
- blob:blob对象类似于操作系统的文件。
下图简单展示了一个工程中各个对象之间的关系,图中每一个对象对应不同SHA-1指针,File1-2为File1-1的修改。
1.6 分支
分支是Git进行版本控制的利器,Git鼓励工程中频繁使用分支与合并,因为Git分支非常轻量级,Git本质上只是一棵巨大的文件树,树的每一个节点就是blob对象,而分支只是树的一个分叉,即分支只是一个有名字的引用,创建分支就是向文件写入一个校验和,速度极快。
Git默认分支为master,创建分支只需要运行
git branch [branch-name]
[branch-name]为分支名字。切换分支只需要运行
git checkout [branch-name]
1.6.1 分支合并
快进(Fast forward):分支合并时,如果顺着一个分支走下去可以到达另一个分支的话,那么git在合并两个分支时只会简单地把指针右移,这种合并过程被称为快进。
当要合并的分支不在一条线时,Git首先会用两个分支的末端及它们共同的祖先进行一次简单的三方合并计算并提交。
如下图将v3、v5和v7合并计算出v8并提交。
1.7 参考资料
[1]软工第二次上机PPT
[2]https://lufficc.com/blog/the-core-conception-of-git
二、Git GUI
-
启动Git GUI:Git GUI Here
-
git clone:主面板选择Clone Existing Repository,设定原路径,本地目标路径与克隆模式,单击Clone按钮
-
git init:主面板选择Create New Repository,设定版本库位置,单击Create按钮
-
git add:存在未被添加到Staging区的改动时,在主操作面板单击Rescan按钮,改动将出现在Unstaged Changes区域内,再次单击Stage Change按钮,将改动添加到Staging区
-
git rm:存在已被添加到Staging区的改动时,选中在缓存区改动列表中一项或多项文件,在菜单栏中选择Commit→Unstage From Commit,可以看到刚被添加的改动被退回到Unstaged Changes区域中
-
git branch与checkout:在菜单栏中选择Branch选项,打开Branch菜单栏,菜单栏中包括五种行为
-
git commit:在将文件添加至Staging区后,在Commit描述窗口输入描述后,单击Commit按钮,按成一次提交(注意要添加Commit Message),在Commit菜单栏有更多操作
-
git merge:在菜单栏中选择Merge选项,在打开的Merge菜单栏中选择Local Merge选项,打开Merge窗口,在窗口中可以选择将要合并的当前分支的本地或远程分支,单击Merge按钮完成合并,若两分支出现冲突,则需要先解决冲突,然后才能进行合并
三、使用实例(一)——github
3.1 关联本地仓库与远程仓库
在Git版本控制系统中,本地版本库与远程版本库的数据交互授权可以通过HTTPS与SSH两种方式实现。前者通过输入个人账户名与密码实现,后者需要在个人账户中配置RSA密钥,将私钥置于本地,公钥上传至远程版本库,再者之后远程版本库将会通过SSH协议认证用户身份,不再需要在每次上传或下载改动时输入用户名与密码。
3.1.1 ssh配制
git config --global user.name "xxx"
xxx指你自己的用户名
git config --global user.email "1234567890@xx.com"
1234567890 @xx.com指你自己的邮箱我不是针对在做各位,这邮箱要是能重名…那我们这么有缘为什么不做个朋友呢 ?
ssh-keygen -t rsa -C '1234567890@xx.com'
打开下方输出中对应路径的 id_rsa 文件,将其中存放的密匙粘贴到对应网页中的key中,title自己定义就可以
3.1.2 http关联本地仓库与远程仓库
第一次通过下面步骤连接GitHub时需要输入账户名和密码,输入错误则无法连接,并且无法在类似界面再次输入,因为该账户名和密码已经自动被windows备份,此时可以通过修改如下图控制面板中的windows凭据信息重新输入正确的账户名和密码。
3.1.3 流程
1. checkout: git checkout xxx
,xxx
是你所要上传到的分支的名称,切换到分支。
2. add:git add xxx
,xxx
是你所要上传的文件(包括路径)。常用git add .
添加本地修改到仓库。
3. commit:将暂存区版本提交到本地版本库(注意不要多次commit不push哦,会出错的)
(1)-m添加注释
git commit -m “message”
git commit -m '
message1
message2
message3
'
不加 -m参数Git默认调用编辑器一般是vim来让你输入这个message
界面就像下图这样 花里胡哨
(2)-a懒汉版打包提交
git commit -a -m “massage”
-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add
添加到暂存区。但是新增文件没有被git管理,是没有办法通过-a识别上传的。
(3)- -amend追加提交
git commit --amend
对于那种马马虎虎还有点强迫症的人来说,这是一个很人性化的设计,这样子你就不会被你的小组同胞,甚至是路过的游客 ,发现自己差不多的东西因为奇奇怪怪的小毛病重复提交了很多版本~~,简称:amend,你的蠢在我(am)这里终止(end)~~ ? 。
4. push:上传到远程仓库
四、使用实例(二)——华为云
- 在华为云上新建仓库,拉取ssh(ssh配制同3,3,1)
- 流程