【Git】第一课:Git的介绍

news2024/9/20 2:08:52

简介

在这里插入图片描述

什么是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具有以下几个优势:

  1. 分布式版本控制:Git是一种分布式版本控制系统,每个开发者都拥有完整的代码仓库的副本。这意味着即使没有网络连接,开发人员仍然可以进行工作,并且可以轻松地与其他开发者进行代码合并和共享。
  2. 高效性能:Git的设计目标之一是提供高效的性能。Git使用了一些优化策略,如快速的提交和检出操作,以及**仅存储差异的方式(增量而非全量)**来减少存储空间。这使得Git能够处理大型项目和大量的代码变更,而不会造成性能问题。
  3. 强大的分支管理:Git的分支管理功能非常强大,允许开发人员创建和切换分支,独立开发新功能或修复bug,而不会影响主线代码。分支合并也非常容易,可以轻松地将不同分支的代码合并到一起。
  4. 版本控制和回溯能力:Git能够跟踪代码的每一次改动,并保留完整的历史记录。这使得开发人员可以轻松地回溯到任何一个特定版本的代码,并查看相关变更和提交信息。这对于排查问题、修复bug和进行代码审查非常有帮助。
  5. 丰富的生态系统:Git拥有庞大的开源社区和丰富的生态系统,有许多第三方工具和服务可供选择,如GitHub、GitLab和Bitbucket等。这些工具和服务提供了代码托管、协作开发、问题追踪和持续集成等功能,可以帮助开发人员更好地利用Git进行项目管理和协同开发。

Git的主要用途包括:

  1. 代码版本控制:Git最初是为了管理Linux内核开发而创建的,因此它被广泛用于软件开发中的代码版本控制。开发人员可以使用Git跟踪代码的变化、管理不同的代码分支,并轻松地进行合并、回溯和撤销代码的更改。
  2. 协同开发:Git的分布式特性使得多个开发人员可以同时在不同的分支上工作,并能够方便地合并彼此的代码变更。开发人员可以通过Git来协同开发新功能、修复bug,并通过代码审查来提高代码质量。
  3. 开源项目管理:Git被广泛应用于开源软件项目的管理。开源项目通常有许多贡献者,需要一个可靠的和高效的版本控制系统来管理代码的变化和合作开发。Git提供了强大的分支管理和合并功能,使得开源项目能够更好地组织和管理代码。
  4. 文档管理: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中,文件主要有四种状态:

  1. Untracked:文件未被跟踪,这意味着文件存在于工作目录中,还没有跟git产生任何关联,因此不参与版本控制。如果要将文件添加到Git库,可以使用git add+git commit命令。
  2. Unmodified:文件已经被提交进git仓库,并且从最后一次提交以来未进行修改。这意味着git仓库中的文件与工作目录中的文件完全一致。如果文件被修改,它将变为Modified状态。如果文件被从版本库中移除,它将回到Untracked状态。
  3. Modified:文件已修改,但尚未进行其他操作。这意味着文件已经被修改,但改动尚未被提交到git库。可以通过git add命令进入暂存(staged)状态,然后再使用git commit命令将其提交到git仓库。或者通过git checkout命令将修改丢弃掉,使文件回到Unmodified状态。
  4. 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替代

参考资料

  1. SVN,GIT版本控制系统简史

课后习题

  1. (单项选择题)目前开源软件开发中最流行的版本控制系统是哪个?_____

A. RCS
B. SVN
C. GIT
D. Mercurial

  1. (单项选择题)以下哪项不是Git的基本概念?____

A. 仓库
B. 分支
C. 引用
D. 元数据

  1. Git中的HEAD指针指向哪里?____

A. 指向所有分支中最新的一次提交
B. 指向当前分支的最新一次提交
C. 指向当前分支的第一次提交
D. 指向最近一次被git add的文件

  1. (不定项选择题)Git中文件状态有哪些?____

A. Untracked
B. Unmodified
C. Modified
D. Staged

  1. (不定项选择题)Git的本地工作区域有哪些?____

A. 仓库
B. 工作目录
C. 远程仓库
D. 暂存区

  1. (不定项选择题)以下哪个是Git的优点?_____

A. 集中式版本管理系统,需要依赖网络运行。
B. 分布式版本管理系统,代码仓库拉取到本地之后,本地即保存了远程仓库的所有信息,可以脱离网络查看本地的改动和其他分支的提交。
C. Git的分布式特性使得多个开发人员可以同时在不同的分支上工作,并能够方便地合并彼此的代码变更。
D. Git可以当做网盘使用,用来备份手机拍的照片。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1535485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu - 编译 linphone-sdk

业务需求需要定制sdk,首先声明我们需要的是在Android4.4上跑的sdk,因此本次编译的sdk最低支持为19(不同版本需要的环境不一致),编译过程较容易,难点在于环境配置 环境准备 Ubuntu 18.04.6 android-sdk_r24.…

Python解释器介绍及安装和目录文件说明

什么是解释器? Python 的代码必须要通过解释器才能运行, 比如我们自己书写python代码想要实现最近本的文字打印:print(hello world!)。但电脑不知道你写的这句代码是干什么用的,当有了python解释器后,Python 解释器会把…

专业135+总分400+重庆邮电大学801信号与系统考研经验重邮电子信息与通信工程,真题,大纲,参考书。

今年分数出来还是比较满意,专业801信号与系统135,总分400,没想到自己也可以考出400以上的分数,一年的努力付出都是值得的,总结一下自己的复习心得,希望对大家复习有所帮助。专业课:(…

JavaWeb里的控制器Servlet,过滤器Filter,监听器Listener

文章目录 简介控制器servlet控制器(Controller)概述控制器的工作原理控制器的生命周期控制器的种类控制器的应用场景示例代码Servlet控制器示例Spring MVC控制器示例 总结 过滤器filter过滤器(Filter)概述过滤器的工作原理过滤器的生命周期过滤器的链式调用过滤器的应用场景示例…

【案例】一个在本地目录下检索文件内容的应用程序

文章目录 需求分析软件设计使用模块程序流程图InputProcessOutput软件实现源码后记存在问题接下来...需求分析 Windows 环境下,软件提供一个使用友好的交互界面,根据关键字检索指定的本地目录下不同文档中的内容,关键字提供或和且索引方式,并且可以同时指定多个目录。 软…

Linux学习-进程

目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例:创建九个子进程 目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例:创建九个子进程 exec函数…

量子计算机

近日,在AWS re:Invent全球大会上,亚马逊官宣AWS三箭齐发量子计算组合拳:Braket、AWS量子计算中心和量子解决方案实验室。 随着亚马逊的强势入局,加上此前鼓吹量子霸权的谷歌、起步最早的IBM、暗自发力的微软&#xff…

LabVIEW高效光伏数据监控与管理系统

LabVIEW高效光伏数据监控与管理系统 随着新能源技术的发展,光伏发电系统作为一种清洁、高效的能源获取方式受到了广泛的关注。但是,由于光伏发电的特性受到多种环境因素的影响,其运行效率和安全性成为了关键问题。因此,开发一个高…

【现代C++】范围基于的for循环

现代C中的范围基于的for循环(range-based for loop)是C11引入的一项特性,旨在简化对容器或范围的迭代过程。这种循环语法不仅使代码更清晰易读,还减少了迭代时的错误。以下是范围基于的for循环的详细介绍: 1. 基本用法…

ElasticSearch使用(一)

文章目录 一、简介1. 数据类型2. 倒排索引3. Lucene4. ElasticSearch5. Solar VS ElasticSearch 二、ElasticSearch入门1. 简介2. 分词器3. 索引操作4. 文档操作5. ES文档批量操作 二、ElasticSearch的DSL1. 文档映射Mapping2. Index Template3. DSL 一、简介 1. 数据类型 结…

Shopee如何选品?Shopee爆品市场趋势预测

Shopee母公司Sea近日发布了其截至2023年12月31日的全年财务业绩报告。 在2023财年报告中,Shopee继续保持稳健增长态势,全年总交易额(GMV)达到创纪录的 785亿美元 ,同比去年增长6.8%。 年度营收增至90亿美元 &…

C#非强签名dll搜索顺序

由于不是强签名dll,所以无效考虑全局程序集缓存 (GAC)。 预备工作 新建解决方案ClassLibrary1,新建类库ClassLibrary1,新建控制台程序ShowDllLoc。 利用VS添加引用。 一,利用app.config设置codebase,设置dll的加载路径为:code…

计算结构体的大小(结构体的内存对齐)

一:问题 问题所在:两个结构体应该都是6个字节大小,为什么一个12,一个6??? 二:如何正确的计算结构体大小? 首先得掌握结构体的对齐规则: 第一: 第一…

mysql四种事务隔离级别,2024金三银四

TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的…

Eureka的介绍和作用,以及搭建

一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具,它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一,它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…

哪些事是你当了领导才明白的?

哪些事是你当了领导才明白的? 毕业5年,17年开始带团队,确实很多事不做到管理这一层,就真的意识不到。 带着【执行者】和【管理者】这2个视角,再结合我毕业至今这5年的所有职场经历,聊聊“职场潜规则”。 …

2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本,这里我选择的是Windows系统、64位 Tips:如果想下载指定版本,点击【以往的版本】,即可选择自己想要的版本下载 二、安装程序 &…

分布式锁简单实现

分布式锁 Redis分布式锁最简单的实现 想要实现分布式锁,必须要求 Redis 有「互斥」的能力,我们可以使用 SETNX 命令,这个命令表示SET if Not Exists,即如果 key 不存在,才会设置它的值,否则什么也不做。 …

MQTTnet实现客户端连接

使用MQTTnet(Version4.3.1.873)库实现多客户端连接多服务端,同时实现断线重连; 如下图所示,开启3个客户端连接3个服务端,当其一个服务端出现异常(服务停止,网络异常无法连接)导致连接断开时&am…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 通过增加容量或提前停止来提高性能。 在深度学习中&#…