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

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

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

相关文章

【leetcode热题】轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

Linux配置bond(网卡绑定)

Linux配置bond(网卡绑定) 最近需要搭建测试环境,为了保证带宽不成为瓶颈,就需要使用bond来提升网络带宽 1 概念、原理、工作模式 1.1 概念:网卡捆绑 网卡绑定,也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一…

Leetcode 200. 岛屿数量

心路历程: 在没有看图论这一章之前看这道题没什么直接的思路,在看完图论之后,学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅,但是需要处理的细节第一次没怎么处理好,花了很多…

[C语言]手动实现strcat strcmp strcpy strstr strtok(静态全局指针初始化方式)代码

strcat strcmp strcpy strstr strtok这些代码均存储在c语言的头文件<string.h>中&#xff0c;如果要使用的话直接调用即可&#xff0c;但是为了增加我们对代码的理解&#xff0c;我们看一下如何手动实现这些代码吧&#xff01; strcat strcat是在字符串后面增加上自己想…

Postgresql数据库入门简介

Postgresql入门 1.Postgresql数据库简介 PostgresQL是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进&#xff0c;PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSql可以运行在所有主流操作系统上&#xff0c;包括Linux…

WebGIS管线在线编辑器(电力、水力、燃气、热力、热能管线)

随着GIS等信息技术的发展&#xff0c;地下管线管理也从二维平面向三维立体管理迈进。传统管线信息管理系统将管线及其附属设施抽象成二维平面内的点、要素&#xff0c;并使用各类点符号、不同颜色线段进行表达。虽能一定程度上满足城市智慧运行的需要&#xff0c;但不能很直观的…

分布式锁简单实现

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

mpyboard开发板使用REPL

文章目录 WindowsMacOS XLinux使用REPL提示符重启开发板 REPL是指交互式解释器&#xff08;Read Evaluate Print Loop&#xff09;&#xff0c;就是一种命令输入交互模式&#xff0c;可以使用命令行的方式与pyboard进行交互。REPL是测试代码和运行命令最简单的方式之一&#xf…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板&#xff0c;13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题&#xff0c;标注&#xff0c;未来主义和线条标题&#xff0c;下三分之一&#xff0c;霓虹灯&#xff0c;带数字的标题&#xff0c;倒计时&#xff0c;表格&#xff0c…

【爬虫】Selenium打开新tab页截图并关闭

如果说 你曾苦过我的甜 我愿活成你的愿 愿不枉啊 愿勇往啊 这盛世每一天 山河无恙 烟火寻常 可是你如愿的眺望 孩子们啊 安睡梦乡 像你深爱的那样 &#x1f3b5; 王菲《如愿》 在自动化测试和网页抓取中&#xff0c;Selenium WebDriver 是一个强大的工具&…

【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:…

【RH134问答题】第十三章 运行容器(下)

系列文章 第一章 提高命令行生产效率 第二章 计划将来的任务 第三章 调优系统性能 第四章 使用ACL控制对文件的访问 第五章 管理SELinux安全性 第六章 管理基本存储 第七章 管理逻辑卷 第八章 实施高级存储功能 第九章 访问网络附加存储 第十章 控制启动过程 第十一章 管理网络…

每天学习一个Linux命令之passwd

每天学习一个Linux命令之passwd 简介 passwd是Linux下用于修改用户密码的命令。它允许系统管理员或用户修改自己的密码&#xff0c;提供了很多选项以满足不同的需求。 命令选项 passwd命令有以下可用选项&#xff1a; -a&#xff1a;显示密码的更改时间和上一次更改密码的…

画图软件diawio

Draw.io | 一款强大且支持在线编辑和导出的流程图绘制神器-CSDN博客 draw.io 免费 好用的流程图绘制软件 - 知乎 (zhihu.com) draw.io (drawio.com)

复试专业前沿问题问答合集7-2——神经网络与强化学习

复试专业前沿问题问答合集7-2——神经网络与强化学习 神经网络与强化学习相关的基础知识问答 Q1: 什么是人工神经网络(Artificial Neural Networks, ANN)? A1: 人工神经网络是一种模仿生物神经网络行为的计算模型,由大量相互连接的人工神经元组成。每个神经元接收输入,…

26. 删除有序数组中的重复项 (Swift版本)

题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你删除重复出现的元素&#xff0c;使每个元素只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0…

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SAO-B…

ENISA 2023年威胁态势报告:主要发现和建议

欧盟网络安全局(ENISA)最近发布了其年度2023年威胁态势报告。该报告确定了预计在未来几年塑造网络安全格局的主要威胁、主要趋势、威胁参与者和攻击技术。在本文中&#xff0c;我们将总结报告的主要发现&#xff0c;并提供可操作的建议来缓解这些威胁。 介绍 ENISA 威胁态势报告…

CVX安装新版本Mosek求解器

在使用连续凸近似&#xff08;SCA&#xff09;求解优化问题时遇到了报错 Problem status : ILL_POSED Solution status : PRIMAL_ILLPOSED_CER并且最后给出的结果为NaN。 在CVX论坛中找到一条回答 具体链接如下&#xff1a; The status is failed 因为我使用的是CVX自带的…

垃圾回收-垃圾回收中的相关概念

目录 System.gc()的理解 内存泄漏&#xff08;Memory Leak&#xff09; 内存溢出&#xff08;OOM&#xff09; Stop The World 垃圾回收的串行、并行与并发 安全点与安全区域 强、软、弱、虚引用 强、软、弱、虚引用 终结器引用 System.gc()的理解 在默认情况下&#…