软工第八次实验——Git

本文详细介绍了Git这一分布式版本控制系统,包括其概述、版本控制系统分类、指针、工作区域、对象、分支等知识,还介绍了Git GUI的操作。同时给出了在github和华为云使用Git的实例,如关联本地与远程仓库的SSH和HTTP配置及操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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占用的空间几乎随着提交的次数线性增长。

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 xxxxxx是你所要上传到的分支的名称,切换到分支。
2. add:git add xxxxxx是你所要上传的文件(包括路径)。常用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:上传到远程仓库

四、使用实例(二)——华为云

  1. 在华为云上新建仓库,拉取ssh(ssh配制同3,3,1)
    在这里插入图片描述
  2. 流程
    在这里插入图片描述
### 计算机组成原理实验教学资源 对于希望获取广东业大学计算机组成原理实验相关教学资源的学生或教师,可以参考以下内容: #### 1. 实验源码与报告 广东业大学的计算机组成原理实验已经开放了部分资源供学生学习和参考。具体来说,该学校的实验分为 **f4a** 和 **f4b** 两部分内容[^1]。这些资源不仅包含了详细的实验代码,还附带完整的实验报告模板,能够有效辅助学生理解实验设计思路以及理论知识点的应用。 项目地址为: [https://gitcode.com/open-source-toolkit/761b8](https://gitcode.com/open-source-toolkit/761b8) 此仓库的内容覆盖了基础到进阶的知识点,适合不同层次的学习者查阅并实践。 --- #### 2. 高级版实验报告 除了上述的基础版本外,“广东业大学计组实验报告高级版”也是一项非常有价值的参考资料[^2]。它不仅仅是一份简单的文档集合,更是一个综合性的学习具包,其中详细记录了每一步的操作流程、常见错误分析以及优化建议等内容。这对于想要深入探究计算机组成原理的同学而言尤为重要。 --- #### 3. 学术会议背景补充 值得注意的是,在实际应用层面,了解最新的行业动态和技术趋势同样重要。例如,即将举办的第四届计算机程与智能控制国际学术会议 (ICCEIC 2023),其主题涉及到了许多前沿领域的发展方向[^3]。虽然这并非直接针对本科阶段的教学需求,但它展示了当前计算机硬件架构及其控制系统的研究热点,有助于激发学生的兴趣并向更高深的方向迈进。 --- #### 4. 考研视角下的扩展阅读 如果未来计划继续攻读研究生学位,则可以从其他高校的经验中汲取灵感。比如哈尔滨业大学在其硕士入学考试科目调整过程中引入的新模式——即强调对整个计算机系统的全面认识而非单一模块的理解[^4]。这种转变提醒我们在准备类似课程时需注重整体框架构建能力培养的同时也要兼顾细节把握技巧。 综上所述,无论是日常课堂练习还是长远职业规划考虑,以上提到的各种渠道都能为我们提供更多元化的视角去探索计算机组成原理这一经典学科的魅力所在! ```python # 示例代码片段展示如何加载外部库文件至本地环境以便进一步研究 import requests def fetch_resource(url): try: response = requests.get(url, timeout=10) if response.status_code == 200: with open('local_copy.zip', 'wb') as f: f.write(response.content) print("Resource downloaded successfully.") else: raise Exception(f"Failed to download resource. Status code: {response.status_code}") except Exception as e: print(e) fetch_resource("https://gitcode.com/open-source-toolkit/761b8/repository/archive/master.zip?token=") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值