软工第八次实验——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) 组长本次博客作业链接 项目宣传视频链接 ...
随机推荐
- universal link使用
iOS9之后,苹果推出了universal link方案,该方案较url scheme有明显的改善.url scheme很难做到唯一. 而 universal link却是你自己控制的. 1.有一个H ...
- 开发中遇到的一些bug及解决方案
一.在使用UIStackView时报“UIStackView before iOS 9.0”.
- 为什么每一个爬虫工程师都应该学习 Kafka
这篇文章不会涉及到Kafka 的具体操作,而是告诉你 Kafka 是什么,以及它能在爬虫开发中扮演什么重要角色. 一个简单的需求 假设我们需要写一个微博爬虫,老板给的需求如下: 开发爬虫对你来说非常简 ...
- [TimLinux] 理解selinux
1. 概念 SELinux有三种工作模式:Enforcing, Permissive, disabled.Enforcing对应又有几种修饰(targeted, minimum, mls). 2. 解 ...
- python光标图片获取
# -*- coding:utf-8 -*- import win32api import win32gui,win32ui import time while True : time.sleep(1 ...
- k近邻聚类简介
简介 在所有机器学习算法中,k近邻(K-Nearest Neighbors,KNN)相对是比较简单的. 尽管它很简单,但事实证明它在某些任务中非常有效,甚至更好.它可以用于分类和回归问题! 然而,它更 ...
- 搭建Squid3 密码账号IP代理
上文中,说明了 Squid3 IP Proxy 隐藏原IP,这里就搭建Squid 3密码账号IP代理进行整理,涉及环境 Ubuntu 18.04. Step 1: htpasswd 和 htdiges ...
- ssh远程管理服务的介绍
第6章 远程管理的介绍 6.1 服务的概念介绍 6.1.1 ssh和telnet服务的相同和不同点 ssh: 服务端口号为22 在数据传输的时候是加密的传输 一般在互联网中使用,可以使用root账号进 ...
- Python3 常用的几个内置方法
目录 max()/min() filter() 过滤 map() 映射 sorted筛选 reduce()减少 max()/min() 传入一个参数 (可迭代对象), 返回这个可迭代对象中最大的元素 ...
- 《Java基础知识》Java数据类型以及变量的定义
Java 是一种强类型的语言,声明变量时必须指明数据类型.变量(variable)的值占据一定的内存空间.不同类型的变量占据不同的大小. Java中共有8种基本数据类型,包括4 种整型.2 种浮点型. ...