软工第八次实验——Git
hiahiahia我又来作恶了,莫名其妙的第八次实验还要更新!
文章目录
- 一、Git
- 1.1 概述
- 1.1.1 Git
- 1.1.2 分布式版本控制系统
- 1.1.3 指令集
- 1.2 版本控制系统
- 1.2.1 版本控制系统
- 1.2.2 本地版本控制系统(Local Version Control Systems)
- 1.2.3 集中版本控制系统(Centralized Version Control Systems)
- 1.2.4 分布式版本控制系统( Distributed Version Control System)
- 1.3 指针
- 1.4 三大工作区域
- 1.5 三大对象
- 1.6 分支
- 1.6.1 分支合并
- 1.7 参考资料
- 二、Git GUI
- 三、使用实例(一)——github
- 3.1 关联本地仓库与远程仓库
- 3.1.1 ssh配制
- 3.1.2 http关联本地仓库与远程仓库
- 3.1.3 流程
- 四、使用实例(二)——华为云
一、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
二、Git GUI
*这部分图片太多了,就不从本地粘过来了,之前直接在CSDN写的,有水印,就当给自己打广告了
启动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指你自己的邮箱我不是针对在做各位,这邮箱要是能重名…那我们这么有缘为什么不做个朋友呢
软工第八次实验——Git的更多相关文章
- 软工实践练习一——使用Git进行代码管理心得
在github.com的操作 注册 创建Organization 将指定代码库fork到小组Organization下 在Organization下创建repository 这些操作在学校的机房已经完 ...
- 软工实践练习一 关于GIT的使用
在Github上的操作部分: 1.在Github网站上进行注册.https://github.com/ 2.创建小组Organization. 3.将代码库https://github.com/sef ...
- 福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
Team information 队名: 彳艮彳亍团队 各成员短学号.名: 学号: 姓名: 本次博客链接: 041602209 黄毓明(临时队长) https://www.cnblogs.com/m ...
- 福大软工 · 第八次作业(课堂实战)——项目UML设计(团队)
团队 学号 姓名 本次作业博客链接 031602428 苏路明(组长) https://www.cnblogs.com/Sulumer/p/9822854.html 031602401 陈瀚霖 htt ...
- 【软工项目Beta阶段】第11周Scrum会议博客
第十一周会议记录 小组GitHub项目地址https://github.com/ouc-softwareclass/OUC-Market 小组Issue地址https://github.com/ouc ...
- 软工+C(9): 助教指南,持续更新...
上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...
- 福大软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)
福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...
- 2017年秋软工-PSP总结报告
一.回顾1 回顾本学期第一次作业[https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/876]. ==>本学期我的第一次作业博客[h ...
- 软工 · 第十二次作业 - Beta答辩总结
福大软工 · 第十二次作业 - Beta答辩总结 写第十二次的时候操作失误直接在Beta版本的博客里改了...第七次冲刺的作业链接补在这里 Beta(7/7) 组长本次博客作业链接 项目宣传视频链接 ...
随机推荐
- Aria2GUI for macOS - 百度网盘高速下载
目录 一. aria2gui 1.1 下载地址:aria2gui 1.2 安装 1.2.1 方式一:手动安装 1.2.2 方式二:Homebrew安装 二. YAAW for Chrome 2.1 下 ...
- pandas学习(四)--数据的归一化
欢迎加入python学习交流群 667279387 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学习(四)–数据 ...
- 数据挖掘算法(一)--K近邻算法 (KNN)
数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...
- python geohash算法逆地址编码原理初探
1.geohash有什么用途呢?这几天刚好有个测试任务是关于设备信息位置处理的,里面提及到geohash:抱着测试的警觉性,打算研读一下这个geohash到底是什么?Geohash 是一种地理编码系统 ...
- LightOJ 1186 Icreable Chess(Nim博弈)
You are given an n x n chess board. Only pawn is used in the 'Incredible Chess' and they can move fo ...
- Node笔记 - process.cwd() 和 __dirname 的区别
process.cwd() 返回工作目录 __dirname 返回脚本所在的目录位置 单看概念觉得都差不多,有种似懂非懂的感觉,那么接下用一个简单易懂的例子来理解下这两者的区别,在此之前先看一个方法 ...
- 【前端知乎系列】ArrayBuffer 和 Blob 对象
本文首发在 个人博客 更多丰富的前端学习资料,可以查看我的 Github: <Leo-JavaScript>,内容涵盖数据结构与算法.HTTP.Hybrid.面试题.React.Angul ...
- mini_magick上传图片
rails上传图片需要用到的gem: gem 'carrierwave'gem 'mini_magick' 在项目Gemfil中添加上面的两个gem,然后bundle install 然后创建modl ...
- Java内存大家都知道,但你知道要怎么管理Java内存吗?
前言 深入研究Java内存管理,将增强你对堆如何工作.引用类型和垃圾回收的认识. 你可能会思考,如果你使用Java编程,关于内存如何工作你需要了解哪些哪些信息?Java可以进行自动内存管理,而且有一个 ...
- Spring与Shiro整合 加载权限表达式
Spring与Shiro整合 加载权限表达式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 如何加载权限表达式 我们在上章内容中画了一张图,里面有三个分项,用户 角色 权限: 那 ...