【Git】第一课:Git的介绍
简介
什么是Git?
Git是一个开源的分布式版本控制系统,用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建,现已成为开源软件开发中最流行的版本控制系统,没有之一。Git允许多人同时在不同的分支上工作,并能够合并不同的分支和代码版本。它具有高效的性能、灵活的分支管理和强大的合并工具,为多人协作开发团队提供了一种可靠的方式来协同开发和管理代码。Git还提供了本地版本控制,使开发人员可以在没有网络连接的情况下进行工作,并能够轻松地回溯和撤销代码更改。
版本控制系统(VCS)的历史和发展
回顾VCS的发展历程,总体上可以划分为三个阶段。
第一代VCS,包括SCSS和RCS。立足于对单个文件变化的跟踪,检出的文件一次只能由一个用户在本地进行编辑,用户通过自己的帐户登录到同一共享Unix主机方式实现。
第二代VCS,包括CVS和SVN。通过引入网络,从而形成了包含正式意义上的项目版本的集中式版本存储库。相比第一代VSC,有了实质性的发展,可以供多个用户同时检出并使用代码,但是他们都需要重新提交到同一中央存储库。存在的问题是严重依赖于中央存储库,对网络和实时性同步要求很大。
第三代VSC,包括Git和Mercurial。到现在发展成为了分布式VCS。在分布式VCS中,创建存储库的所有副本都是相同的,无需一个集中的中央存储库。无需通过网络实时同步内容,只需本地创建提交,分支和合并打开了路径,在合适时候再推送到远端库。
纵观历史,SVN和Git是VCS发展史上最具代表性的两大杰作。从功能上来讲,它们基本上是一致的。最大的区别在于:
- SVN是集中式版本管理系统,很多操作都需要依赖网络,使的它的发展受到了极大的约束。
- Git属于分布式版本管理系统,代码仓库拉取到本地之后,本地即保存了远程仓库的所有信息,包括所有分支、所有tag、所有commit,简单说本地仓库就是远程仓库的一个镜像,这就使的它的很多操作可以脱离网络在本地实现。
随着VCS的持续发展,Git已经一家独大,现已成为开源软件开发中最流行的版本控制系统,没有之一。所以学习版本控制,只需要学习Git就可以了。掌握了git的精髓,即使因为一些历史原因还需要去访问一些svn仓库,那也可以基于git的思想和经验,快速掌握svn的常见命令,甚至可以直接使用Git官方提供的git-svn工具(Git - git-svn Documentation)来操作svn。
Git的优势和用途
Git具有以下几个优势:
- 分布式版本控制:Git是一种分布式版本控制系统,每个开发者都拥有完整的代码仓库的副本。这意味着即使没有网络连接,开发人员仍然可以进行工作,并且可以轻松地与其他开发者进行代码合并和共享。
- 高效性能:Git的设计目标之一是提供高效的性能。Git使用了一些优化策略,如快速的提交和检出操作,以及**仅存储差异的方式(增量而非全量)**来减少存储空间。这使得Git能够处理大型项目和大量的代码变更,而不会造成性能问题。
- 强大的分支管理:Git的分支管理功能非常强大,允许开发人员创建和切换分支,独立开发新功能或修复bug,而不会影响主线代码。分支合并也非常容易,可以轻松地将不同分支的代码合并到一起。
- 版本控制和回溯能力:Git能够跟踪代码的每一次改动,并保留完整的历史记录。这使得开发人员可以轻松地回溯到任何一个特定版本的代码,并查看相关变更和提交信息。这对于排查问题、修复bug和进行代码审查非常有帮助。
- 丰富的生态系统:Git拥有庞大的开源社区和丰富的生态系统,有许多第三方工具和服务可供选择,如GitHub、GitLab和Bitbucket等。这些工具和服务提供了代码托管、协作开发、问题追踪和持续集成等功能,可以帮助开发人员更好地利用Git进行项目管理和协同开发。
Git的主要用途包括:
- 代码版本控制:Git最初是为了管理Linux内核开发而创建的,因此它被广泛用于软件开发中的代码版本控制。开发人员可以使用Git跟踪代码的变化、管理不同的代码分支,并轻松地进行合并、回溯和撤销代码的更改。
- 协同开发:Git的分布式特性使得多个开发人员可以同时在不同的分支上工作,并能够方便地合并彼此的代码变更。开发人员可以通过Git来协同开发新功能、修复bug,并通过代码审查来提高代码质量。
- 开源项目管理:Git被广泛应用于开源软件项目的管理。开源项目通常有许多贡献者,需要一个可靠的和高效的版本控制系统来管理代码的变化和合作开发。Git提供了强大的分支管理和合并功能,使得开源项目能够更好地组织和管理代码。
- 文档管理:Git不仅可以用于代码管理,还可以用于文档管理。开发人员可以使用Git来跟踪文档的变化、协同编辑和合并文档的改动。这对于团队合作编写文档、制定规范和撰写技术文档非常有帮助。
总之,Git是一个功能强大的版本控制系统,可以帮助开发人员更好地管理代码,提高协同开发效率,并保证代码的可追溯性和质量。
Git涉及的基本概念
仓库(repository)
Git三大本地工作区域之一,仓库就是Git的数据库,所有数据文件都存储在.git/目录下,Git使用仓库来存储代码和版本历史记录。仓库可以是本地的,也可以是远程的。本地仓库是存储在开发人员的计算机上,而远程仓库是存储在网络服务器上,用于协同开发和代码共享。
工作目录(Working Directory)
Git三大本地工作区域之一,指的是平时我们用来存放项目文件,看得见文件,打得开文件、改得了文件的地方。不管是本地创建的仓库还是从远程地址拉取下来的仓库,只要后面涉及文件的增删改,首先都是在工作区完成的。
暂存区(Stage/Index)
Git三大本地工作区域之一,它是介于工作区和仓库之间的一个临时区域,用来临时存放改动。本质上它只是一个特定格式的二进制文件(.git/index),主要保存即将提交到仓库里的文件列表等信息。git add命令的作用就是将工作目录中改动的文件添加到暂存区。
远程仓库(remote)
也是Git的一个重要工作区域,只是它是存储于网络服务器上的Git仓库,用于协同开发和远程代码共享。开发人员可以将本地仓库推送到远程仓库,也可以从远程仓库中拉取代码更新。常见的远程仓库服务有GitHub、GitLab、Gerrit等。
提交(commit)
提交是Git中记录代码变更的基本单位。每次对代码的修改都可以通过提交来保存和描述,包括修改的内容、作者、时间戳等信息。提交将代码的状态从未提交状态转换为已提交状态,从而使得代码变更可追溯和回溯。
HEAD指针
HEAD是Git中的一个特殊指针,它通常指向当前分支的最新提交。每当执行git commit或git checkout之类的操作时,HEAD引用的位置都会发生变化,这些变化过程会被记录在**.git/logs/HEAD**文件中。这样,Git就能够追踪HEAD引用的历史变化,从而能够回滚到之前的状态或执行其他与版本控制相关的操作。
文件状态
在Git中,文件主要有四种状态:
- Untracked:文件未被跟踪,这意味着文件存在于工作目录中,还没有跟git产生任何关联,因此不参与版本控制。如果要将文件添加到Git库,可以使用git add+git commit命令。
- Unmodified:文件已经被提交进git仓库,并且从最后一次提交以来未进行修改。这意味着git仓库中的文件与工作目录中的文件完全一致。如果文件被修改,它将变为Modified状态。如果文件被从版本库中移除,它将回到Untracked状态。
- Modified:文件已修改,但尚未进行其他操作。这意味着文件已经被修改,但改动尚未被提交到git库。可以通过git add命令进入暂存(staged)状态,然后再使用git commit命令将其提交到git仓库。或者通过git checkout命令将修改丢弃掉,使文件回到Unmodified状态。
- Staged:文件已经被添加到暂存区,准备被git commit命令提交到git仓库中。提交到git仓库之后,git仓库中的文件和本地文件将再次保持一致。
分支(branch)
分支是Git中独立存在的代码副本。开发人员可以创建和切换分支,以独立开发新功能或修复bug,而不会影响主线代码。分支可以并行地进行开发,并能够轻松地合并到其他分支或主线代码中。
合并(merge)
合并是将不同分支或代码版本的变更合并到一起的操作。当开发人员完成某个分支上的工作后,可以将该分支的代码合并到其他分支或主线代码中,以集成新的功能或修复到整体代码中。
标签(tag)
标签用于给特定的提交打上有意义的标记,如版本号或发布版本等。标签可以帮助开发人员快速定位和回溯到特定的版本的代码,方便版本发布和维护。
引用(ref)
引用(reference)本质上是一个指向某个提交对象(commit)的指针或别名。Git 使用引用来快速定位和访问存储库中的特定提交。引用通常存储在.git/refs
目录下,该目录下又包含了不同类型的子目录,如heads/
、tags/
和remotes/
,分别对应不同类型的引用:分支引用(Branch References)
、标签引用(Tag References)
、远程引用(Remote References)
。
以上是Git的基本概念,它们共同构成了Git的核心功能和特性,帮助开发人员进行代码版本控制、分支管理和协同开发。
git适合管理哪些文件
最适合哪些?
纯文本文件:txt
源代码文件:c、cpp、java、py、js等一切纯文本格式的源代码文件
项目文档:md等格式
不适合哪些?
1、doc、exe、elf、db、二进制数据等带有一定格式的非纯文本可读文件。
问题:无法diff,任何改动都只能更新整个文件,无法做到增量式更新
解法:将文档转化为markdown格式使用git来维护、文档使用语雀等知识库进行维护、其他二进制文件如果必须放在git,考虑git-lfs替代
2、大文件。
问题:不能把git仓库当网盘使用,容量有限&拖慢性能
解法:网盘、云存储(比如阿里云oss、腾讯云cos等)、考虑git-lfs替代
参考资料
- SVN,GIT版本控制系统简史
课后习题
- (单项选择题)目前开源软件开发中最流行的版本控制系统是哪个?_____
A. RCS
B. SVN
C. GIT
D. Mercurial
- (单项选择题)以下哪项不是Git的基本概念?____
A. 仓库
B. 分支
C. 引用
D. 元数据
- Git中的HEAD指针指向哪里?____
A. 指向所有分支中最新的一次提交
B. 指向当前分支的最新一次提交
C. 指向当前分支的第一次提交
D. 指向最近一次被git add的文件
- (不定项选择题)Git中文件状态有哪些?____
A. Untracked
B. Unmodified
C. Modified
D. Staged
- (不定项选择题)Git的本地工作区域有哪些?____
A. 仓库
B. 工作目录
C. 远程仓库
D. 暂存区
- (不定项选择题)以下哪个是Git的优点?_____
A. 集中式版本管理系统,需要依赖网络运行。
B. 分布式版本管理系统,代码仓库拉取到本地之后,本地即保存了远程仓库的所有信息,可以脱离网络查看本地的改动和其他分支的提交。
C. Git的分布式特性使得多个开发人员可以同时在不同的分支上工作,并能够方便地合并彼此的代码变更。
D. Git可以当做网盘使用,用来备份手机拍的照片。
相关文章:

【Git】第一课:Git的介绍
简介 什么是Git? Git是一个开源的分布式版本控制系统,用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建,现已成为开源软件开发中最流行的版本控制系统,没有之一。Git允许多人同时在不同的分支上工作&…...

知识蒸馏——深度学习的简化之道 !!
文章目录 前言 1、什么是知识蒸馏 2、知识蒸馏的原理 3、知识蒸馏的架构 4、应用 结论 前言 在深度学习的世界里,大型神经网络因其出色的性能和准确性而备受青睐。然而,这些网络通常包含数百万甚至数十亿个参数,使得它们在资源受限的环境下&…...
【爬虫】Selenium打开新tab页截图并关闭
如果说 你曾苦过我的甜 我愿活成你的愿 愿不枉啊 愿勇往啊 这盛世每一天 山河无恙 烟火寻常 可是你如愿的眺望 孩子们啊 安睡梦乡 像你深爱的那样 🎵 王菲《如愿》 在自动化测试和网页抓取中,Selenium WebDriver 是一个强大的工具&…...

09 事务和连接池
文章目录 properties文件连接池service层实现类dao层实现类dao层实现类 连接池类: 创建线程池静态常量,用于放连接。 创建Properties静态常量,用于解析properties文件 静态代码块中,解析properties文件,将解析结果用于创建连接池 …...

P4344 [SHOI2015] 脑洞治疗仪 线段树+二分
主要是维护一个连续区间,比较经典的题目,还要考虑一下二分的情况,否则很难处理,比较有难度。这里和序列操作一题的区别是不需要考虑1的个数,因为不需要取反。传送门https://www.luogu.com.cn/problem/P4344 #include&…...
解决大型语言模型中的幻觉问题:前沿技术的综述
大型语言模型中的幻觉问题及其解决技术综述 摘要 大型语言模型(LLM)如GPT-4、PaLM和Llama在自然语言生成能力方面取得了显著进步。然而,它们倾向于产生看似连贯但实际上不正确或与输入上下文脱节的幻觉内容,这限制了它们的可靠性和安全部署。随着LLM在…...
机器学习流程—AutoML
文章目录 机器学习流程—AutoMLAutoML工具Auto-SKLearnMLBoxTPOTRapidMinerPyCaretAuto-KerasH2OAutoML谷歌AutoML云Uber LudwigTransmogrifAIAutoGluonAutoWekaDataRobot...
Ubuntu 23.10 tar包安装和配置Elasticsearch kibana 7.13.3
目录 一、环境说明 二、准备工作 三、安装elasticsearch 3.1 安装elasticsearch 3.2 添加服务和设置开机启动 四、安装kibana 4.1. 安装kibana 4.2 添加服务和设置开机启动 出于工作需要,需要在Ubuntu 23.10系统上通过tar包方式安…...

glibc内存管理ptmalloc
1、前言 今天想谈谈ptmalloc如何为应用程序分配释放内存的,基于以下几点原因才聊它: C/C 70%的问题是内存问题。了解一点分配器原理对解决应用程序内存问题肯定有帮助。C也在用ptmalloc. 当你在C中new一个对象时,底层还是依赖glibc中的ptma…...

HarmonyOS入门学习
HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…...

【Mock|JS】Mock的get传参+获取参数信息
mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…...
spring cloud gateway k8s优雅启停
通过配置readiness探针和preStop hook,实现优雅启动和停止(滚动部署) 1. k8s工作负载配置 readinessProbe:httpGet:path: /datetimeport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 1periodSeconds: 30successThreshold: 1fa…...

嵌入式软件面试-linux-中高级问题
Linux系统启动过程: BIOS自检并加载引导程序。引导程序(如GRUB)加载Linux内核到内存。内核初始化硬件,加载驱动,建立内存管理。加载init进程(PID为1),通常是systemd或SysVinit。init…...
css禁用元素指针事件,鼠标穿透,点击下层元素,用`pointer-events:none;`
pointer-events: 对鼠标事件的反应 MDN pointer-events 英文 https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events 菜鸟教程 CSS pointer-events 属性 https://www.runoob.com/cssref/css3-pr-pointer-events.html 常用取值 auto 和 none pointer-events: aut…...

Eureka的介绍和作用,以及搭建
一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具,它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一,它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…...
shell和linux的关系
Shell 和 Linux 之间存在密切的关系,但它们并不是同一个东西。让我们分别了解一下它们: Linux: Linux 是一个自由和开放源代码的类UNIX操作系统。 Linux 的内核由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布&…...

数据在内存的存储
整数在内存中的存储 我们来回顾一下,整数在计算机是以补码的形式进行存储的,整数分为正整数和负整数,正整数的原码、反码和补码是一样的,负整数的原码、反码和补码略有不同(反码是原码除符号位,其他位按位取…...
JavaScript之ES中的类继承与Promise
类 ES5中的类及继承 //人function Person(name,age){this.name name;this.age age;}Person.prototype.eat function () {console.log(this.name "eat");}//程序员,继承,人function Programmer(name,age,language){//构造函数继承Person.…...

浅析多模态大模型技术路线梳理
前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作紧随其后…...

使用 Amazon SageMaker 微调 Llama 2 模型
本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高,国内外各种基座大语言竞相出炉,在其基础上衍生出…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...