Git——神一般存在的分布式版本控制系统

     写在前面的话:作为一名优秀的程序员,每天都会写、修改大量的代码,这就需要一个强大的工具记录你的每次改动。如果你连分布式版本控制系统都不知道,那说明你有点low了,自己该反思反思了(手动狗头)。这篇文章呕心沥血的带你从零开始Git之旅。

PART Ⅰ 分布式版本控制系统简介

1. 什么是分布式版本控制系统?

背景带入:相信每名程序员的大学时代都会有一个叫“学生信息管理系统”的项目实训,没有也没关系,你且听我娓娓道来。
——“辉星啊,按学号查询学生信息的那部分代码写完了吗,我这刚写完增加学生的信息的代码。”
——“写完了,我马上传给你哈。”

      看吧,我们两人合作编写一个“学生信息查询系统”程序,要麻烦到每次修改后都要汇总到一个人那里,然后由这个人合并、修改代码。时间长了,电脑里存的代码越来越多也越来越乱,你想回到某次修改之前,却苦于在"update.cpp" “update1.cpp” “update2.cpp” "updatelatest.cpp"文件中一个一个的打开查看。两人都在感叹,如果有个软件能够追踪代码的每次修改就好了。这里,Git就登上了历史的舞台。(当然也有其他的分布式版本控制系统,但目前最流行的还是Git,建议入门并深入研究Git)

(1)集中式版本控制系统

      既然要谈分布式版本控制系统,那就不得不说说集中式版本控制系统。集中式版本控制系统,顾名思义,有一个在“中间的”中央服务器。这个中央服务器的作用就是供每台个人计算机向其提交文件。在工作时,我们需要先从中央服务器获得最新版本,然后开始工作,工作结束后,再将自己更新后的文件推送到中央服务器。
      这样以来,集中式版本控制系统的缺点就显现出来了。如果这个中央服务器挂了,那所有人都要停下手头的工作,直到它恢复正常。另外,集中式版本控制系统必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
     常见的集中式版本控制系统:CVS(最早、开源、免费),SVN(开源、免费,目前用的最多),VSS(集成在Visual studio中)。

(2)分布式版本控制系统

      区别于集中式版本控制系统,分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了代码"update.cpp",你的同学也在他的电脑上改了"update.cpp",这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。也正是凭借着多人协作的优越性,分布式版本控制系统完胜集中式版本控制系统。
      在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同学病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
      这样看来,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。
      常见的分布式版本控制系统:git(免费、开源)、 Mercurial(轻量级) 、Monotone(免费)。

注:我们以Git为例,入门并深入学习分布式版本控制系统。至于Git的前世今生,如果小伙伴感兴趣的话,可以自行Google,这里不再赘述。

PART Ⅱ Git的使用

1. 先来看一下相关概念

工作区、暂存区、本地仓库、远程仓库

先给大家抛出一张图,便于大家理解上述四者的关系。
在这里插入图片描述
工作区(Workspace):程序员进行开发(改动)的地方,是当前看到的,也是最新的。平常项目开发就是拷贝远程仓库中的一个分支,基于该分支进行开发,在开发过程中就是对工作区的操作。
在这里插入图片描述
      如上图所示,“GitLibrary”是我的目标工作区,也就是以后的代码管理都在这里进行,该目录下的文件夹是我拉取的远程仓库,它就是本地仓库

暂存区(Index/Stage):① 在本地仓库的目录里,有一个“.git”文件,该文件目录下的index文件就是暂存区。暂存区会记录添加文件(git add)的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。
② 可以使用git status查看暂存区的状态,暂存区标记了当前工作区中,哪些内容是被git管理的。
③ 当项目完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。

在这里插入图片描述
在这里插入图片描述
本地仓库(Repository):① 版本库或本地仓库,其实说白了就是一个目录,这个目录中的所有文件都被git管理,不管你做什么操作都会被记录,包括:增加、删除、修改文件等,都会被记录下来,以便后来跟踪与修改相关记录,甚至被还原。工作区目录下的文件就是本地仓库。② Git的一般操作流程是,先把工作区的文件“git add”到暂存区,再提交(git commit)到本地仓库,最后“git push”到远程仓库中。③ 可以在任何地方新建本地仓库,只需要在目标目录下执行"git init"指令,就会将此目录自动初始化为本地仓库,同时它会新建".git"目录

远程仓库(Remote):① 远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。②** 每次开始写代码前,首先从远程仓库pull最新的代码下来,防止别人改动了,我们没有更新到,引起冲突。**然后把代码先add到暂存区,再commit到版本库,最后push到远程仓库。如果push出错,就是前面提到的,可能有人push了新代码到远程仓库,这时就需要先pull下来。push成功后,你就可以在码云的仓库面板中看到相应的代码文件啦。③ 版本库都是在我们自己电脑上面的,一旦电脑硬盘挂了,那么我们还是可能会一无所有啊;并且,代码库在我自己的电脑上面,如果我电脑没有设置为服务器,那么其他的电脑就无从访问。为了解决这些问题,我们就需要把我们版本库部署到一台方便大家访问的服务器上面,这个不在我们自己电脑上面的仓库,就叫远程仓库。目前有两种形式的远程仓库:
Ⅰ. 自己搭建一台服务器,上面安装Git相关的软件,然后24小时开机让大家能够访问;
Ⅱ. 使用第三方的Git托管服务,如GitHub、码云(Gitee)等。
我推荐第二种,因为搭建服务器工作量大、成本高。下面我将以码云(Gitee)为例,介绍Git的代码托管服务。

2. 利用码云实现代码的远程托管

(1)先来介绍一下有关概念

① GUI客户端:与命令行相对立的一个概念,它提供一种可视的界面供用户操作Git,而不必输入命令行进行相关操作。在安装 Git 的同时,你也装好了它提供的可视化工具,gitkgit-gui,只不过它们是内置的,可以通过命令行打开,这里不做解释,感兴趣的同学可以自行去Google。
Ⅰ. gitk 是一个历史记录的图形化查看器。 你可以把它当作是基于 “git log” 和“git grep” 命令的一个强大的图形操作界面。 当你需要查找过去发生的某次记录,或是可视化查看项目历史的时候,你将会用到这个工具。
Ⅱ. git-gui 则主要是一个用来制作提交的工具。
这里我将主要通过Git Bash,以命令行的形式对Git进行相关操作。因此,要介绍一下Git Bash。
② Git Bash:它是一个适用于Microsoft Windows系统环境的应用程序,它为Git命令行体验提供了一个仿真层。Git Bash相当于在Windows下模拟出的UNIX命令行终端,然后在这个终端里做Git相关的版本控制。为什么要用Git Bash呢?这是因为Git是在UNIX风格的命令行环境中运行的,而Windows操作系统使用的是Windows命令提示符,这是一个非UNIX终端环境,所以用Git Bash模拟出UNIX下的命令行终端。
③ 其他的几款Git GUI客户端:GitHub Desktop(注意这与我们之前提到的GitHub不一样,前者是一个GUI客户端,而后者则是用来做代码托管的远程仓库)、Source Tree、TortoiseGit等。

注:读者朋友们可以自行选择这些GUI客户端,由于这里用命令行操作Git,故不再介绍客户端的使用。

(2)餐前甜点结束,正餐开始

      我们日常工作或学习中,用到最多的就是拉取远程仓库的代码或者推送本地仓库的代码到远程仓库,因此这里主要介绍这两种操作。

  • pull操作

① 首先创建一个文件夹,用来存放pull到本地的文件等内容,这个文件夹就是本地仓库,它存放在工作区里。它可以与你的码云上的仓库同名,也可以不同名,这里同名。
在这里插入图片描述

② 进入步骤①中创建的文件夹里,右键—>Git Bash Here,这时会弹出一个框,如下图。
在这里插入图片描述
在这里插入图片描述
③ 如果是第一次使用Git和码云,需要一个叫“密钥”的东西把Git和码云关联起来。输入命令行ssh-keygen -t rsa -C “验证码云的邮箱”(该命令行的空格应严格执行),作用是产生密钥,如下图所示。之后,一直回车,直到出现下一个命令行输入的位置,如下下图所示。
在这里插入图片描述
在这里插入图片描述
④ 查看步骤③中产生的密钥,命令行为cat ~/.ssh/id_rsa.pub,输入命令行后如下图所示。
在这里插入图片描述
⑤ 将产生的密钥复制添加到码云的相应位置中去。
Ⅰ. 在码云的个人头像处找到设置(当然,其他方法找到设置的效果一样),点进去,如下图所示。
在这里插入图片描述
Ⅱ. 找到安全设置—>SSH公钥,如下图所示。
在这里插入图片描述
Ⅲ. 将步骤④中产生的的密钥(以ssh开头,自己邮箱结束的那一串字符)复制、粘贴(右键copy或paste)到码云的SSH公钥中去,标题随意,如下图所示。
在这里插入图片描述
⑥ 在码云中创建仓库(实际上这就是我们所说的“远程仓库”),笔者之前已经创建过仓库,因此创建仓库的过程略。在仓库中找到“克隆/下载”,复制SSH码(注意一定要是SSH码),这段SSH码在后面要用到,如下图所示。
在这里插入图片描述
⑦ 在命令行中定义两个变量,一个是自己验证码云的邮箱,另一个是码云的用户名,命令行分别是:
邮箱:git config --global user.email “1邮箱名”
用户名:git config --global user.name “用户名”
如下图所示(邮箱名和用户名都给马赛克了,嘿嘿)。
在这里插入图片描述

Ⅰ. 重新打开步骤①中创建的文件夹,右键—>Git Bash Here。
Ⅱ. 初始化Git,命令行:git init,效果如下图所示。
在这里插入图片描述
⑨ 在命令行后粘贴步骤⑥中复制的SSH码,这里的命令行是 git remote add origin SSH码,效果如下图所示。
在这里插入图片描述
⑩ 把码云中的所有文件pull到本地(步骤①中创建的文件夹)中,命令行:git pull origin master,如下图所示。这时打开步骤①中创建的文件夹,你会发现里面全是码云中的文件夹,如下下图所示。
在这里插入图片描述
在这里插入图片描述

注:(1)读者在首次使用Git和码云时,需要先用密钥将两者关联起来,因此上述的步骤都要执行。
    (2)读者在接下来(第二次、第三次……)的使用中,只需执行步骤⑧、⑨、⑩即可完成pull操作。

  • push操作

① 在需要push到码云的文件的根文件夹下:右键—>Git Bash Here,输入命令行git add .(注意这里是“add+空格+ .”),这里的 “.” 代表全部的意思,也可以具体制定文件名,如 git add helloworld.cpp。如下图所示。
在这里插入图片描述
② 添加注释,这样可以在以后的查阅中清楚自己当时push文件的目的,命令行:git commit -m "注释”,如下图所示。
在这里插入图片描述
③ 将本地文件push到码云中去,命令行:git push -u origin master,如下图所示。这时,我们已经将一个本地的文件push到码云的某个仓库中了,如下下图所示。(注:在之后的push中,命令行可以改为git push origin master,上述的命令行适用于第一次使用码云)
在这里插入图片描述
在这里插入图片描述

注:在进行push操作时,需要先将码云中的项目pull到本地仓库中(原因前面已提到,可查看“远程仓库”的②),然后将本地的文件push到码云的远程仓库中去,这里的pull是为了解决冲突。


      俗话说,工欲善其事必先利其器,学会使用Git对我们而言绝对是必要的。通过阅读这篇文章,相信你对Git有了一定的了解,而且也会用码云进行代码的托管了。
      当然,这篇文章并没有囊括Git的所有点,我认为除了本文中提到的内容外,读者朋友们也可以尝试:① 使用Source Tree等GUI客户端来代替Git Bash的命令行;② 用GitHub代替码云,完成代码的远程托管。具体怎么操作,就交由你来探索了。
      点赞、评论、收藏,你的鼓励就是我的动力!

猜你喜欢

转载自blog.csdn.net/m0_46308522/article/details/107200984
今日推荐