动画:扫盲 Git 版本控制(上)

最近不少读者和鹿哥反馈说,能不能扫盲一下 git,无论是 github 开源项目网站还是团队合作,都少不了 git 版本控制的使用。加上很多的在校生没有过多接触过 git,所以呢,鹿哥决定最基础的讲起,请大佬多多包涵我这基础的内容。

因为 git 涉及到的内容太多,写一篇太长,在阅读体验上不友好,那么分为两篇吧。本篇主要分享一些 git 常用的操作以及命令背后的原理。


什么是版本控制?

当我们做项目的时候,少不了来回的改动项目功能和代码,一般我们修改的会覆盖以前的内容,但是突然有一天,老板不要新的需求了,而是要原来的那个功能,咋办呢,只能一点点删了最新的代码,然后再重新写原来的功能。

如果当项目变的庞大,需要多个人进行开发,每个人开发的功能各不相同,合并项目时,不得不手动合并,万一出现各种 bug,每个人都要改动整体项目,删除或增加部分代码,万一合并错误,导致整个项目处于一个未知的状态,此时项目代码变得异常混乱。

版本控制就是来解决以上这两种情况的,你改动了哪些地方,都会被版本控制系统所记录,对于以上第一种情况,我写的新功能老板不要了,我可以通过版本控制回退到未修改之前的状态,对于上边团队合作,可以通过版本控制直接合并,无需手动一点点的复制粘贴。


git 的崛起

说起 Git 的崛起特别有意思,最早的版本控制是出于 BitKeeper 公司的。而且应用于最大的开源系统 Linux,Linux 的作者Linus 早就把 Linux 作为全世界的开源项目,Linux 的诞生少不了世界很多开源贡献者的参与。

因为贡献的开发者来自世界各地,就会出现上述出现的问题,前期只能靠 Linus 手动合并代码,后来系统变的原来越庞大,不得不使用 BitKeeper 公司的版本控制,但是 BitKeeper 公司呢,看了他们这么热爱开源,就免费让 Linux 的开发者们使用。

面对来自世界各地 Linux 的开发者,更何况这些人都是牛人,风云四起,不得不打算搞点事情。于是对 BitKeeper 公司版本控制下手了,对公司内部的协议进行了逆向工程(反编译),但是很不幸运,被人家知道了。

这下可好了,本来人家公司让你免费试用,你非要破解人家东西,还让人家知道了,弄得 Linux 的作者 Linus 不得不去道歉,但是 Linux 道歉没有妥协,最后人家 BitKeeper 公司收回了免费使用权。

兄弟们,既然人家不让用了,那就自己动手丰衣足食呗。牛人 Linus 仅仅花费了十天的时间用 C 编写出了 git 的第一个版本。我和我的小伙伴们惊呆了!

git 经过几年火了起来,不愧是玩 Linux 的牛人,git 不仅性能极大的得到提升,而且开源免费,这就使得 git 在 2008 年入住全球最大的开源社区,为开源项目免费提供存储,导致了很多开发者喜欢上了 git,现如今 git 也称为最流行的分布式版本控制系统。

git 之前的版本控制是 SVN 和 CVS,但是这两者有很明显的缺点,它是集中式的版本控制,什么是集中式的?就是必须提供一台服务器,团队合作都围绕着这个服务器进行合并。它是基于局域网的,比如现在有些公司还在使用 SVN,一旦到了家里办公,所写的代码就不能提交到这个服务器。

但是 git 就不同了,任何地方,任何地点,不同局域网下,想什么时候提交就什么时候提交,而且提交的速度非常的快,到底有多快,一会体验一下就知道了。

以上 git 的历史和特点就暂时介绍这些,感兴趣童鞋可以去网上多多查阅相关 git 内容。


本地版本仓库

对于 git 的安装不在过多的费口舌,直接去官网下载即可。

下面直接在本地版本仓库讲起吧。我们通过下边的命令创建一个本地 git 版本仓库。

git init

这个命令执行后,发生了什么?我们可以理解为初始化当前所在项目,创建一个空的仓库,我们称为 1 号仓库,我们对这个仓库可以进行一系列的各种增加、移除等操作。

动画:扫盲 Git 版本控制(上)_第1张图片

此时会在当前目录下生成一个 .git 文件,那么这个文件就是来记录当前版本库里内容变化的。

动画:扫盲 Git 版本控制(上)_第2张图片

我们完全可以把这个仓库当成现实中的存储货物的仓库,当然,仓库肯定要有个管理员的,这个管理员就是上边的 .git 同学。


提交货物

然后我在此目录下创建一个项目文件,叫做“project.md”,然后执行下边命令。

git  add  project.md

以上过程就相当于,此时鹿哥开着拖拉机拉着一批货物来了,要在仓库中存一批货物。但是管理员说必须老板同意了之后才让我存,那么这批货就先暂时存放 2 号仓库中。

2 号仓库又称临时仓库,只能存放临时货物,等老板签字画押了,才能将 2 号临时仓库的内容正式存入大仓库中,那么 add 就是添加到 2 号临时仓库中。

动画:扫盲 Git 版本控制(上)_第3张图片
我们可以通过让仓库管理员输入以下命令,看看鹿哥的货物是否存入了 2 号暂存仓库中。

git status

动画:扫盲 Git 版本控制(上)_第4张图片
对,没错,是鹿哥的那批货物。

这时,老板同意可以把暂存在 2 号仓库的货物放到 1 号正式仓库中了,那么管理员开始输入命令,将暂存仓库的货物进行录入正式仓库。

git commit -m '2020 3/24 鹿哥的货物 10吨'

在这里插入图片描述

commit 就是正式提交的意思,-m 是提交的内容的信息。在正式开发中,你每提交一次代码肯定是要说明提交的那些内容,是修改了还是增加了功能,这东西都要写上说明,因为万一项目出现问题,会通过提交的信息进行回退。

是的,这些提交记录都是由管理员记录的,我们通过以下命令看一下管理员的记录本。

git log

动画:扫盲 Git 版本控制(上)_第5张图片
这个记录中,包括是谁提交了代码,什么时间提交的,提交的信息是什么,都会在管理员这个小本本上记录着。

随后鹿哥又陆陆续续存了好几吨货物,如下记录:

动画:扫盲 Git 版本控制(上)_第6张图片

版本回退

有时候我们的程序员可能喝了酒去提交代码,不小心把没有做完的功能代码提交上去了。第二天,酒醒了,突然发现自己手贱,咋办?

不慌,我们可以撤销(也叫做回滚)喝醉酒前的代码状态。还是拿货物的例子去说明,比如鹿哥不想存入那 20 吨了,我应该咋办?执行下面命令。

git  reset --hard HEAD^

在这里插入图片描述

动画:扫盲 Git 版本控制(上)_第7张图片

该命令的意思是回滚当上次提交代码之前,也就是喝醉酒之前代码的状态。此时鹿哥的 20 吨就相当于没有在存在仓库中。我们在看一下管理员的记录。

git log

动画:扫盲 Git 版本控制(上)_第8张图片

那么问题来了,鹿哥,万一遇到一个能喝的程序员,喝的大醉,一下提交了好几次代码,需要回滚好几次,你这一次次的太慢了吧。

也是哈,如果我们想回滚哪一次就回滚哪一次,应该怎么做?我们先可以通过一个命令,查看一下我们管理员执行命令的记录。

git reflog

在这里插入图片描述

每个命令前边都有一个提交的 id,我们通过这个 id,执行下面命令,想回滚到哪一次就回滚到哪一次。


撤销修改

除此之外,我们在写代码时,还会经常出现一下两种情况。

如果我们提交完成了,老板让我增加一个功能,这时,我写了一天,在没有提交(git add)之前老板告诉我,不想要这个功能了,那么此时我们咋办?不怕,我们执行下面命令,直接丢弃工作区(目前项目)的修改。

git checkout -- project.md(文件名)

但是我们已经提交到了暂存库中,然后又修改了内容,老板才告诉我这个功能不要了,我们就用以上回滚的方式,丢弃缓存区的添加。

git reset HEAD project.md(文件名)

如果我们不小心删除了我们项目的部分代码,此时本地项目和仓库中项目不一致,应该咋办?

要么将仓库的项目也进行删除,就是正常的进行提交修改就行了。要么就恢复本地项目误删除的文件,也是使用上边我们说到的命令。

git checkout -- project.md(文件名)

远程仓库

上边只是你自己在本地玩耍,提交代码,以后到了公司一个大项目肯定是很多人一块完成的,那么就必须有一个统一的远程仓库用来存储各个开发者由本地仓库提交的代码进行合并。等到项目开发完成,我们直接用远程仓库的代码上线就可以了。

是的,想必你已经想到了,Github 可以创建一个远程的仓库,仓库可以任何人都可以提交,也可以规定某些开发者可见(私有仓库与公有仓库)。

在 Github 上创建远程仓库:

动画:扫盲 Git 版本控制(上)_第9张图片
然后我们可以配置仓库的相关信息如下:

动画:扫盲 Git 版本控制(上)_第10张图片
我们创建完成之后,必须让本地仓库和远程仓库进行关联,关联之后才能够将本地的代码进行提交。

本地仓库和远程的仓库通信需要 SSH 加密的,需要设计一样的秘钥才可以进行通信。

创建秘钥:

本地仓库设置密钥需要和远程仓库及逆行加密通信。在 window 下创建 SSH Key,一路回车。在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

ssh-keygen -t rsa -C "[email protected]"

Github设置 key:

在远程仓库设置一个或多个公钥知道有哪里的本地仓库要通信。

登陆GitHub,打开“Account settings”,“SSH Keys”页面。然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key 。

动画:扫盲 Git 版本控制(上)_第11张图片

我们通过上边设置好之后,就可以将本地仓库关联远程仓库了。

git remote add origin 远程仓库地址

通过这一条命令就可以关联远程仓库,远程仓库的地址在这。

动画:扫盲 Git 版本控制(上)_第12张图片
我们现在只是关联上远程仓库,而没有将本地的分支推上去,对于分支的概念涉及到挺多内容,暂时不在这一节展开讲。

git push -u origin master

通过上边的命令,将本地仓库的主分支和远程的主分支关联(可以理解为当前版本代码会有一个指针指向当前版本)。这样本地有什么改动的,通过提交到远程仓库,远程仓库的分支内容也会进行改变。

动画:扫盲 Git 版本控制(上)_第13张图片


克隆仓库

有时候,你可能没有参与项目的创建,而是老板把你临时派到了其他项目组协助一起做项目。

此时你本地是没有项目的,所以要在远程仓库把其他组的项目拉下来,然后再进行快速开发。我们把远程仓库项目拉下来的过程称为克隆仓库。通过以下命令来进行。

git clone 远程仓库地址

此时我们可以进行愉快的开发了。


小结

本篇主要涉及到的一些 git 基础操作,后续还会有如何解决代码冲突以及分支的各种概念,以及遇到项目 bug 如果暂存手头的工作等。

今天文章到这里结束了,虽然这篇内容接近基础,但是写起来真是费劲,本想着周一发表,看到文章涉及到的太少,然后第二天又补充了很多,全文 4230 字,如果对大家有帮助,欢迎点赞和留言,鹿哥唯一剩下的动力靠你们啦!


作者info:

作者:小鹿
公众号: 「小鹿动画学编程
微信:lxq17853556107 如果有什么问题,欢迎来找我~
简介:一个三本混出来的一个幽默风趣的程序员,维护着一个既有技术又有温度的原创号,一直认为能把复杂的东西讲明白是一件很牛逼的事情。加粗样式

你可能感兴趣的:(git)