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

  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可以当做网盘使用,用来备份手机拍的照片。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv各个模块介绍(1)

Core 模块:核心模块,提供了基本的数据结构和功能。 常用的核心函数: cv::Mat:表示多维数组的数据结构,是OpenCV中最常用的类之一,用于存储图像数据和进行矩阵运算。 cv::Scalar:用于表示多通道…

mac下Appuim环境安装-持续更新中

参考资料 Mac安装Appium_mac电脑安装appium-CSDN博客 安卓测试工具:Appium 环境安装(mac版本)_安卓自动化测试mac环境搭建-CSDN博客 1. 基本环境依赖 1 node.js 2 JDK(Java JDK) 3 Android SDK 4 Appium&#x…

51单片机学习9 串口通讯

51单片机学习9 串口通讯 一、串口通讯简介UARTSTC89C51RC/RD的串口资源 二、51单片机串口介绍1. 内部结构2. 寄存器(1)串口控制寄存器SCON(2)电源控制寄存器PCON 3. 计算波特率4. 串口配置步骤 三、 开发示例1. 硬件电路2. 代码实…

好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化

好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化 Scholar:搜索 YOLO小目标医学方面最新论文Scraper:爬虫自动化数据清洗数据分析 点击 Explore GPTs: Scholar:搜索 YOLO小目标医学方面最新论文 搜索 Scho…

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包

超过 1200 个能够拦截在野外检测到的 2FA 的网络钓鱼工具包。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶…

【计算机】——51单片机

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路(IC芯片) 单片机是单片微型计算机(Single Chip Microcomputer)的简称,用于控制领域,所以又称为微型控制器(Microcontroller U…

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

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

学成在线_视频处理_视频转码不成功

问题 当我们用xxljob进行视频处理中的转码操作时会发现视频转码不成功。即程序会进入下图所示的if语句内。 问题原因 在进行视频转码时程序会调用Mp4VideoUtil类下的 generateMp4方法,而result接收的正是该方法的返回值。那么什么时候generateMp4方法的返回值会…

SQLiteC/C++接口详细介绍sqlite3_stmt类(七)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(六) 下一篇: 无 22、sqlite3_column_database_name 用于返回结果集中指定列的数据库名称。如果结果集是由多个Join操作产生的,…

抖音视频关键词爬虫批量采集软件|视频提取下载工具

视频关键词批量采集软件 — 助力您快速获取所需视频 主要功能: 关键词批量提取视频和单独视频提取,提取后下载功能。 功能解析: 1. 关键词批量提取视频的解析 通过输入关键词进行视频搜索和提取。例如,输入“汽车配件”&#x…

四种最新算法(冠豪猪优化算法CPO、鳑鲏鱼优化算法BFO、河马优化算法HO、新雀优化算法NOA)求解机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

npm ERR! code ELIFECYCLE 解决办法

npm ERR! code ELIFECYCLE 解决办法 问题分析可能原因解决方法 问题 使用Vue脚手架构建项目的时候出现npm ERR! code ELIFECYCLE 分析可能原因 vue-cli-service 并没有加入到环境变量里 解决方法 ./node_modules/.bin/vue-cli-service serve

【Linux】多线程编程基础

💻文章目录 📄前言🌺linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 🌻linux线程冲突概念互斥锁函数介绍加锁的缺点 📓总结 📄前言 无论你是否为程序员,相信多线程这个词汇应…

MySQL之体系结构和基础管理

前言 本文以linux系统的MySQL为例详细介绍MySQL的体系结构,因为在实际生产环境中MySQL的运行环境都是linux系统。同时介绍MySQL的基础管理,包括用户管理和权限管理等。 MySQL体系结构 MySQL客户端/服务器工作模型 MySQL是C/S架构,工作模型…

Ribbon知识点

1、通过类实现重写Ribbon规则 1.1注意 这个类一定不能跟启动类放在同一个包下面,不能被componentScan给扫描到。 需要如图放置: 要是被componentScan给扫描到,则会被所有的服务提供方所共享,那么就不能实现指定服务用不同的Ribbo…

pycharm中的Mark Directory As 里的 Sources Root、Excluded...

这里主要提到两个文件夹的作用,分别是Sources Root、Excluded 1、Sources Root 1、场景 平时使用pycharm,有时出现导包问题,将那个目录Mark Directory as sources root,然后就可以正常运行代码了 2、原理 其实主要就是将那个目录…

官宣|阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会

摘要:本文整理自阿里云开源大数据平台徐榜江 (雪尽),关于阿里巴巴捐赠的 Flink CDC 项目正式加入 Apache 基金会,内容主要分为以下四部分: 1、Flink CDC 新仓库,新流程 2、Flink CDC 新定位,新玩法 3、Flin…

从相机空间到像素空间的投影和反投影原理和代码

目录 从相机空间到像素空间的投影 效果 ​编辑 公式 ​编辑 代码 像素空间到相机空间的反投影 记录一下从相机空间到像素空间的投影(3D-->2D)和像素空间到相机空间的反投影(2D-->3D)。 推荐blog:SLAM入门之视…

Leetcode 684. 冗余连接

心路历程: 最开始的想法是把环给破开就行,思路:建图,遍历找环,然后找到edges里属于环的一个边;每次不选择上一步走过的边,DFS,需要回溯。后来查阅资料发现这道题适合用一个叫并查集…

那些场景需要额外注意线程安全问题

主要学习那些场景需要额外注意线程安全问题,在这里总结了四中场景。 访问共享变量或资源 第一种场景是访问共享变量或共享资源的时候,典型的场景有访问共享对象的属性,访问static静态变量,访问共享的缓存,等等。因为…