当前位置: 首页 > news >正文

git的使用——初步认识git和基础操作

文章目录

  • 初步了解版本控制器git
    • 版本控制
    • 版本控制器
      • 对版本控制器的需求
      • 版本控制器git
      • 分布式版本控制(去中心化)
      • github和gitee是什么
    • git的简史
    • 在github/gitee创建项目
    • 安装git
    • git的基础操作
      • 克隆仓库
        • 查看.gitignore
      • git三板斧
        • 将文件添加到暂存区
        • 提交到本地仓库(处理第一次提交问题)
        • 将文件推送至远端仓库(同步两端仓库)
      • 部分查看指令
        • 查看过往提交记录
        • 查看仓库状态
      • 更新仓库

初步了解版本控制器git

本片文章隶属于专栏——git的相关使用。本篇文章开始将开始学习一些git的相关操作和学习一些相关知识,加深对git的理解。

如果有使用过github/gitee两个网站的网友都知道,这两个网站内提供了远端的仓库。我们可以将本地计算机中的一些文件提交到远端进行保存。需要的时候也可以将远端仓库拉取下来。这些操作都离不开一个重要的软件——git。那么,什么是git呢?

版本控制

学习git之前,我们得理解什么是版本控制。只有理解了版本控制,我们才能更深刻地明白git的作用,接下来我们将一起来看看何为版本控制。

这里我们举一个生活中常见的例子:
假设你是一个公司里员工,一天,领导叫你攥写一份市场调研报告。我们提交了初稿上去,但是领导说不满意,我们就在原来的初稿文件上修改。然后等我们修改了若干次后,领导说了一句,”后面写的还不如初稿呢,干脆就拿初稿来好了“。这个时候,你的心里必然是奔腾过1w只羊驼,心想这叫什么个事儿啊。
在这里插入图片描述
就如上图所示,改来改去,发现不如初稿。但是这里有一个问题就是,这个初稿早就给改的面目全非了。因为是再原基础上进行修改的,所以也根本不记得初稿写的是怎么样的了。这个时候就该抓瞎了。

所以,这里必然引入了一个问题,叫版本控制。即每一次我们都需要留下对应的版本,这是为了应对善变的甲方需要采取的万全之策。

所以,这里最简单的方法就是,每写一个版本,就把一个版本保存下来。然后复制一份再去以此进行修改。就如下图所示,这就是最简单的版本管理。
在这里插入图片描述
这样子,我们就有任意多个版本,这样子就不怕上面遇到的那个问题了。

版本控制器

对版本控制器的需求

前面稍微地了解了版本控制器的概念,但是自行管理版本是很烦闷的一件事情。如果只是简简单单的管理一份报告,那其实还好。最多也就是开一个文件夹,里面保存着各个版本的报告而已。但是如果是工程代码呢?

工程代码的文件数是非常庞大的,需要管理的内容也更多,更细。如果知识简单粗暴的进行复制粘贴副本,在副本上进行修改。看似可以,实则非常浪费。因为每次改动一版就要复制一份完整的源码,然后修改完之后再重新存放回仓库里面,这岂不是很浪费空间?如果一份工程里面所有的文件是1GB,那么每管理一次版本就要占用1GB的内存,这也太浪费了。

此外,人力管理也是非常疲惫的,有时候我们还不止是不同版本的管理的问题。进行版本管理的原因就是文件内容不符合要求。那我们就需要记录一下每一个版本对应的问题。但是随着时间一长,文件又多,我们肯定是记不住大部分修改的内容的。

所以这里就迫切二点需要一个能够进行自动管理文件版本的,能够记录每一次修改的变化及其修改原因,并且能够轻松的溯源历史上所有的版本,而且还要尽可能地占用小的存储空间。基于上面地种种原因,这才有了像git这类的一系列的版本控制工具。

版本控制器git

我们现在的需求是,能够有一个软件,对我们本地的一个仓库(其实就是一个文件夹)内的文件进行版本管理。而且要能够满足上面提及的那些要求,那么git是如何做的呢?

首先,我们要知道git的本质就是个版本控制的工具,就是用来帮我们做版本控制的:

当我们使用git软件管理某个仓库的时候,在该仓库内会存放着一个隐藏文件夹.git,这个隐藏文件夹内部其实就是git进行管理仓库内文件的一些必要的配置信息和文件(这点先作为了解,后面部分会细讲)。

然后git的版本管理并不是我们理解的那样,使用复制旧版本再进行修改得到新版本,从而记录住一个文件有多个不同的版本。我们说过那样是特别浪费空间的。git版本控制的时候,对于文件相同的部分不做记录,只记录新版本相对于旧版本的变化的点。所以我们可以通过特定指令,调取出每个版本之间变化点是什么。git也就是根据这个进行版本的溯源的。
比如初稿写了十行代码,然后第一次减少了第5行。那么git就会记录,从第一个版本到第二个版本的变化就是删除第五行代码,那么想要从第二个版本回退到第一个版本只需要逆向操作,在第5行添加删除的代码即可。
我们想要旧版本,这种操作就叫做回退。git会做文件变化的逆向操作。如果想要从旧版本变到新版本,这个就按照记录信息操作下去就可以了。(git支持版本回溯)。
这样一来,git通过只记录变化信息的方式,不仅可以轻松的在版本之间切换,还极大地减少了版本控制所需要的存储空间,这是一举两得。

同时,git在版本管理的时候,还支持备注功能。即进行版本控制的时候,我们可以自行输入本次修改的原因,这样子我们就可以很轻松的查询每一个版本对应的修改原因了。

分布式版本控制(去中心化)

这个话题我们稍微地了解一下即可。

当前市面上是有很多种版本控制工具的,版本控制工具又被分为两大类别:
集中式版本控制系统分布式版本控制系统

集中式最常见的工具就是SVN。对于集中式,我们可以这么理解:
即所有的版本控制操作必须交给一个中央仓库进行管理。所有人的代码都是这样,只要想用SVN进行版本管理,就必须交付给中央仓库这个中间装置,通过这个中间装置来进行一系列地操作,等于是围着中央仓库转。而且也支持目录级权限的管理,适合企业内网做开发。
在这里插入图片描述
但是这个方式最大的缺点就是太过依赖于中央仓库,并且需要联网使用。而且不同的用户之间是不能互相的进行仓库的拉去和提交操作的。

而我们要讲的git其实是一个分布式的版本控制工具。它和SVN这样的区别就大了。它的架构是分布式的,即不需要像集中式那样所有事情必须交给中央仓库来做。
分布式根本没有中心而言,只要两端都装了git这个工具,那么就可以进行互相操作。比如A和B都装了git,那么A可以把代码提交到B所在的A开辟的对应的仓库,也可以从仓库里面拉取东西。反过来B对A也是一样的。
在这里插入图片描述
就如上图所示(没有完全展示所有git用户之间的关系),正是因为git这种分布式架构,它的操作速度特别快,而且也非常方便。非常适合开源项目、团队协作。灵活性也很强。而且最重要的是,它可以配合github等一系列平台进行结合使用(后面会说)。

所以从某种意义上来说,git不仅仅是一个客户端(client),也是一个服务器(server)。因为它既可以在本地进行管理,也可以作为其他端的服务器进行接收存储和管理。

github和gitee是什么

我们前面一直在提一个词,叫”本地仓库“。难道还有不是本地的?没错,我们常用的github/gitee就是,很多人会把github这类网站平台理解为git。其实这是错的,它们有关联,但不是完全一样。现在我们来讲一下它们到底是什么。

其实我们当前只要下载了git这个软件,就已经是可以在我们自己的电脑上进行文件的版本管理了。但是我们又会经常把自己的代码等相关文件提交到gitee/github上,这是为什么呢?

其实所谓的github/gitee就是一个网站,这个网站背后连接了一个云服务器。这个云服务器上安装了git这个软件。我们前文提到,git本身即使客户端,也是服务器。所以gitee/github对应的云服务器也是可以进行接收我们上传的文件的。所以我们就可以把在自己电脑中的需要管理的仓库上传到云服务器中,云服务器中可以开一个一模一样的仓库(文件夹)进行管理上传的文件。这就是远端仓库,我们可以理解为云盘一样的东西存在。只不过说gitee和github在面对个人的情况下(或人少的情况下)是免费的。

所以,像github/gitee,本质是一个基于git的托管平台。它们只是一个网站,但是这个网站是配合着一个云服务器的。这个云服务器上面装了git,只要我们的机器上装了git,就可以实现两端的仓库管理。

类比解释​​
​​Git 本身​​:相当于一个本地版本控制工具(类似单机版的存档系统)
​​GitHub/Gitee​​:相当于给你的 Git 仓库加了一个“云盘”,并附赠了多人协作的“办公软件”(如在线编辑、任务分配)

只不过相较于简单的云端存储,还围绕 Git 构建了完整的开发者生态(社区、自动化工具等)。所以,从今往后,就不要再把git和gitee/github这样的网站平台搞混了。

git的简史

这里稍微地来聊一下git的简史。稍微了解一下即可。

这个事情其实要回归到Linux系统的开发过程来说。我们知道,Linux系统是一个开源的系统,是由世界上很多有伟大的愿景/梦想的工程师一起开发的。当时开发的时候就面临着一个问题,就是Linux之父——Linus Torvalds​​在写好了初版的Linux内核后,就把它开源让世界上的人都参与进来。这样,他就会每天都收到很多代码。

那Linus Torvalds每天就会看看哪里写得好,就给他合并进去。但是Linus Torvalds也是遇到了很困难的问题——即也需要版本管理。要不然每天都是ctrl c/v也是很费劲费时。所以他就想要去找对应的版本控制工具。

但是当时市面上的版本控制工具都是收费的。Linux之父认为收费有违开源精神就不愿意。但是有一个公司开发的BitKeeper​​(一个商业版分布式版本控制系统)愿意免费提供给Linux开发团队用,但是好景不长,后面免费使用权给撤销了。

所以Linus Torvalds​​就忍不了了,直接自行写出了git的雏形,然后开源。然后大量的工程师涌入git这个工具的开发,然后开发完后再拿对Linux开发做版本管理。最后Linux和git一起上线了。

最后由于git这个工具写的实在是太厉害,太好,经过长时间的发展,越来越多的企业和用户选择使用git。目前git的市场份也比SVN大得多。

在github/gitee创建项目

这里我们来简单提一下如何在github/gitee上创建一个仓库。但是这里要注意的是,由于github的服务器在外网,我们国家是没有办法直接使用github的。所以在这里选择使用gitee来进行操作。后序的代码提交大部分也是放到gitee上。

gitee是国内自主开发的平台,我们直接使用的话访问速度极快。

1.首先我们需要注册账号(如果有了就跳过此步)
这里会要求我们输入账户名和邮箱等,按照要求填写即可!注意要记得用户名和邮箱,这个是有用的!这个后面会说。

2.在我的界面开源看到“新建”操作,这个就是用来创建仓库的。
在这里插入图片描述
如图所示,旁边也会有我们提交的动态。里面的内容其实就是我们每次提交的时候的备注。

3.点击新建,进入仓库创建页面
在这里插入图片描述
仓库名称按照需求填写即可。

然后底下会有开源和私有选择,这个看个人想法。开源即把自己的仓库放出来,能够让人搜得到而已。私有的就只有自己能看见。

4.配置仓库
然后我们会发现底下其实还会有一些选项,其实不选也可以,因为默认的完全够用,只不过还需要做一些调整。

在这里插入图片描述
初始化仓库里面可以选择语言。我们选择c++,因为我提交的代码都是c++。当然也可以根据自己学习的语言来进行选择。后面的.gitignore选择一样的语言即可。等下会说这个文件的作用,这个还是很重要的。开源许可证其实默认就可以(因为我们的目前来说基本上只有自己看,所以选择什么都无所谓)。

后面的分支模型选择单分支模型master,当然不选择默认就是这个。这里也是一样的,由于我们当前还不熟悉git的分支操作,而且我们自己提交的代码也不是什么企业大工程,完全没有必要搞多分支模型,所以默认即可。

安装git

前面说了那么多,如果真的想配合gitee使用管理我们的本地仓库和远端仓库,我们当前的机器上也是需要安装git这个软件的。

我们可以在Windows系统上安装,还可以配合一些图形化界面工具进行辅助操作。但是Windows系统下的就不去介绍了,上网搜一下就可以了。
而且对于git的指令来说,在Windows和Linux下都是一样的,所以这里直接拿云服务器进行操作了,即使用指令:
Centos系统:sudo yum install git
Ubuntu系统:sudo apt install git -y

注意,使用普通账户安装需要进行提权。

安装完后,使用指令git --version查看下载版本,若出现版本号即安装成功:
在这里插入图片描述
注:我这里使用的是Centos 7.x系统。

git的基础操作

前面讲的大部分内容都是围绕着git的由来和介绍,以及gitee和github平台的介绍。这个部分我们会讲解一些操作。

当前还是有必要把在Linux上写的代码提交到gitee上的,因为后期会更换Ubuntu系统,有了这个远端仓库进行同步存储,这样子就可与很轻松的把写过的代码全部传到新系统了。

克隆仓库

我们就以刚刚在gitee上建立的仓库myTest进行测试。
在这里插入图片描述
按照刚刚的配置创建好后,会发现昵称旁边会出现一个”initial commit“,这是记录着我们第一次创建仓库的记录。那个地方其实是显示我们最近一次提交到远端仓库的备注的。

然后我们发现里面有三个文件。其中.gitignore是一个忽略管理文件的配置文件。这个我们先不管,等下再做。我们就知道当前我们只能提交一些没有被忽略的文件即可。
还有两个README文件,可以理解为这个仓库的介绍。可以自己填写。这里就先不写了。

我们现在只是在远端上开了一个仓库,没办法在本地仓库之间进行互联。所以我们需要进行一个操作,即克隆仓库。把这个远端的仓库克隆到本地去即可:
使用指令git clone URL,其中URL是仓库链接。

点击当前界面右上角”克隆/下载“:
在这里插入图片描述
URL就是第一个方框内的链接。这里有很多种协议,当前选择HTTPS即可。我们复制该连链接,在我们当前的机器下使用克隆指令(Windows下不演示):
在这里插入图片描述
我们会发现当前工作目录下出现了一个叫做my-test的文件夹,这个其实就是我们克隆到本地的远程仓库(也叫工作区)。这个仓库和远程的是一模一样的:
在这里插入图片描述
只不过存在了一个隐藏文件.git

查看.gitignore

我们使用vim打开该文件查看:
在这里插入图片描述
这个文件的其实就是个配置文件,只要在该工作区下的文件有出现上面的后缀,就不会被管理,这个就不演示了。我们可以添加几个文件后缀进去:
在这里插入图片描述
比如编译时产生的中间文件,我们不想提交也加进去。

git三板斧

我们接下里讲介绍使用git的三板斧。有了这三板斧就可以很轻松的实现远端仓库和本地仓库之间的互相管理了。

将文件添加到暂存区

首先,我们使用指令git add (文件名),可以把指定的文件提交到文件的暂存区。
(如果不写文件名会把所有未add的文件都给添加到暂存区)
但是如果是比较新的版本的git可能不支持该操作(git add),可能需要使用git add -a / git add .才能把所有未add的文件添加。

为什么是暂存区呢?

在这里插入图片描述
其实是因为.git这个文件夹内部结构导致的。其内部有个暂存区。被add的文件先会被放在暂存区内。等到用户使用提交到git仓库指令后再一次性提交到git仓库。这样可以极大地提高效率(如果add一次就提交一次是很浪费时间和资源的,有太多IO操作)。

还需要注意的是,管理文件的时候,被管理文件一定要在工作区内,也就是和.git同一级的目录下,要不然会报错。
在这里插入图片描述
我这里随便创建一个文件:
在这里插入图片描述
并且将所有的翻译过的中间文件生成,我们现在试着提交到本地仓库去看看,是否会忽略掉了一些指定忽略的文件。

提交到本地仓库(处理第一次提交问题)

我们需要使用指令git commit -m “提交的备注”进行提交到本地仓库。
注意这个备注尽量别乱写,养成一个好习惯。

在这里插入图片描述
这里突然不给提交,出现了两行要我们Run的指令:
git config --global user.email “you@example.com”
git config --global user.name “Your Name”

这个意思其实就是要我们填写一下我们要提交到的远程仓库(这里是从gitee复制过来的链接)的,我们在该平台上注册的账户名和邮箱。一定要和当时写的一模一样,否则提交代码到gitee上后不会显示有提交记录(也就是个人主页中的小绿点)。

我们只要配置好对应的邮箱和账户名即可。

然后重新add一下和commit一下即可,我们发现只添加了一个HelloWorld.c。
在这里插入图片描述

将文件推送至远端仓库(同步两端仓库)

然后我们现在只是完成了本地仓库的管理。我们还需要把刚刚添加到本地仓库的文件推送到远端仓库,使用git push仓库即可,会把所有本地仓库中没有被推送到远端的文件推送过去:
在这里插入图片描述
这里会要我们输入我们gitee账户的账户名和密码。这个可以自行配置一下不用输入,这里就不演示了。然后我们刷新一下我们对应的gitee仓库看看:
在这里插入图片描述
在这里插入图片描述

确实提交上来了,而且只有.c文件,说明确实很多文件被过滤了。
而且用户名和邮箱配置正确的话,在个人主页处往下拉可以看见今日提交记录会变成绿色。

至此就讲完了git的三板斧操作了。当然比如像取消add指令这样的操作还没有讲,这个可以上网查一下。在这里就先不说了。

部分查看指令

这个部分简单了解一下就可以了。后面的文章再来细说。

查看过往提交记录

我们可以使用指令git log查看过往的提交记录,里面清清楚楚的展现了每一次提交的唯一编码(commit后面的码),用户、邮箱、日期、时间、以及相关备注。
在这里插入图片描述
我们也可以配合Linux的一些指令比如grep,根据关键词找到想要的提交记录:
在这里插入图片描述

查看仓库状态

我们现在新建三个文件h1.txt h2.txt h3.txt,不进行add。

我们使用指令git status查看当前仓库状态:
在这里插入图片描述
git会告诉我们,哪些文件是Untracked的(未add的),哪些是修改了但是还没被提交的,比如图中提到的.gitignore。
我们试着把三个文件add一下:
在这里插入图片描述
这个时候,Untracked的文件就没有了,也就是现在所有的文件都已经被放入暂存区了(注意:提交过的不需要再add,如果修改了就重新commit就好)。

所以这个指令是用来查看当前仓库状态的。

其它的指令就先不讲,当前能够学会基础的三板斧即可。至于很多内容其实可以到gitee上查看,git有的功能那里都有,还都是图形化界面。

更新仓库

这里我们还有提及一个问题,那就是多用户操作一个仓库的时候。
这里我就在Windows下和Linux下一起操作进行演示。

在这里插入图片描述
现在我们成功的把仓库克隆到Windows系统的某个路径下了,我们来添加一些文件:
在这里插入图片描述
我们添加了一个h4.txt,内容就是自己的名字。

我们试着提交:
在这里插入图片描述
成功了,出现了一些乱码,但是不要紧,这不是重点。

在这里插入图片描述
我们发现gitee上是成功的推送来了。但是这个仓库在Linux账户下也有,很有可能我并不知道当前已经有其它的用户更新过仓库了,假设我当前就是不知道,我们来试试看:

在这里插入图片描述

直接就报错了(rejected!)。这就是因为我当前不知道仓库已经被更新过了。我们知道,远端上的仓库一定是最新的版本。而且现在远端仓库是被修改的,如果我就这么提交了,那么这不就错乱了吗?到底选择哪个作为最新版本呢?而git管理的仓库必须是一个版本一个版本递进更新的。所以这时候我们应该先更新一下当前仓库:

使用指令git pull即可把远端仓库和当前仓库合并(使用该指令后页面会跳转到一个vim界面,不要管,直接退出即可)。
在这里插入图片描述
这个时候就发现,仓库确实给合并了。

我们再试着提交:
在这里插入图片描述
在这里插入图片描述
这时候就会发现成功了。

所以这也就告诉我们,如果是多人使用的一个远端仓库,每次使用前应当同步一下两端的仓库。因为很可能会出现没办法提交的情况!

http://www.xdnf.cn/news/1058869.html

相关文章:

  • DeepForest开源程序是用于 Airborne RGB 机器学习的 Python 软件包
  • 使用 Elasticsearch 提升 Copilot 能力
  • [计算机网络] 网络的诞生:协议的认知建立
  • 2025年暑期在线实习项目分享
  • 理解 create 指向的箭头函数
  • 从零Gazebo中实现Cartographer算法建图
  • DBeaver 中 Greenplum、PostgreSQL 和 PostgreSQL (old) 驱动的区别
  • 前端跨域解决方案(4):postMessage
  • 剑指offer32_二叉搜索树的后序遍历序列
  • 新发布的一款使用ReactNative新架构加载Svga动画的开源插件[android/ios]
  • 数据结构——选择题—查漏补缺
  • 【unitrix】 3.0 基本结构体(types.rs)
  • 二、OpenCV的第一个程序
  • Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量
  • 结合 STM32CubeMX 使用 FreeRTOS 实时操作系统
  • 【ClipPal】推荐一个非常好用的粘贴板记录工具
  • 侧信道分析中的简单模板攻击(TA)Python实现(带测试)
  • 【web应用】Vue 3 中实现 Chart.js 折线图:详细指南与最佳实践
  • 14.2 《3小时从零搭建企业级LLaMA3语言助手:GitHub配置+私有化模型集成全实战》
  • 基于CNN的FashionMNIST数据集识别6——DenseNet模型
  • 基于深度学习的智能文本摘要系统:技术与实践
  • Uniapp性能优化全面指南:从原理到实践
  • GNU Octave 基础教程(1):在 Ubuntu 22.04 和 Windows 11 上的安装指南
  • 【Linux】UDP与TCP协议
  • 电路图识图基础知识-普通卧式镗床识图(三十)
  • 深度体验KingbaseES在线平台:从零掌握企业级数据库实战(附架构图+代码案例)
  • Python基础学习框架(总周期:8周)
  • 九日集训第六天
  • 1572. 矩阵对角线元素的和
  • 计算机网络学习笔记:TCP流控、拥塞控制