GitHub系列教程三————上手Git
讲真,上周在放假当天,我在公号更新的这篇Github系列教程二 「加入Github」,不知道是因为放五一假的喜悦还是咋滴,导致那篇文章的阅读量大大下降,恩,绝对是因为放假了,大家都没时间看文章。
为了能保证以后假期大家可以好好的玩耍,所以,我可能不会再在放假的时候更新文章了。
那么,没看这篇Github系列教程二 「加入Github」,赶紧去看。
多的不扯了。
这篇,我将针对Git的知识来一次讲解,争取能让你们可以速成Git,或者解决积攒下来的Git概念上的问题。
Git简介
Git是Linux发明者Linus开发的一款版本控制系统。
首先,它是一个版本控制系统,那什么是版本管理,到底怎么理解版本控制系统?
版本管理:我们开发好的软件是通过应用平台来进行版本管理的。那么同样的,Git的作用则是对我们的代码进行版本管理。
同时,它也可以解决这样一些问题:
比如,为了防止代码丢失,我们会在本地和远端都进行一次存放。同时也需要git这样一套机制来实现本地和远端的同步。
比如,我们上传到应用市场的软件出现了重大Bug,那么我们可以通过Git管理的代码,来紧急对代码进行revert(回滚)到稳定版本。
又比如,我们的软件有对应的版本,那么同样的,Git也可以为我们的代码设置对应的版本号(tag),这样我们就可以清楚地找到对应版本软件的代码。同时还可以查到每次提交的Log,从而找到修改这块代码的开发者。
其次,它和SVN最大的区别就是分布式管理。那么分布式管理又是什么呢?
分布式管理:每一个本地都是一个版本控制的系统,同时远端的仓库也是一个版本控制系统。这样就既达到了代码的安全性也促成了高效的软件开发。
所以,Git对我们的代码管理起了很大的作用。同时这也是在我们整个软件开发中最重要的一个环节。
Git安装
Git本身就是一个工具,在Github系列教程一 「开门」中也做了讲解。
所以在使用之前,我们需要安装这个工具。
以下,我给出各个平台的安装方式:
Mac:https://sourceforge.net/projects/git-osx-installer/
Windows:https://git-for-windows.github.io/
Linux: apt-get install git
上面,Mac和Linux 系统的,我强烈建议你使用命令来做。Windows的还是用图形界面的比较方便。
当然就算你是Windows,我也是建议下你使用命令来玩Git。 因为用了Shell之后,你会对整个Git的版本机制有一层更深的理解。
同时我推荐两个图形化的Git工具。
SmartGit: http://www.syntevo.com/smartgit/
SourceTree: https://www.sourcetreeapp.com/
这两个都有很不错的交互体验。
配置Git
我们的Git环境已经安装好了。
那么,Git是如何提交代码,又是如何标识代码的提交者呢?
这时候,就引出了ssh_key这个东西。这个key是git帮我们生成,并且保存在隐藏文件夹的一个密码。
接下来,我们让Git帮我们生成这个ssh_key。
命令如下:
这个文件夹中有 id_rsa和id_rsa.pub两个重要文件。
其中id_ras.pub是我们要提供给Github来管理的。另外一个id_rsa是一个私钥。
这里我们也可以看到git对每次代码的提交都是做了rsa算法的加密。所以这两个文件,自己一定要保管好,不能泄漏,泄漏的话,别人就可以用你的名义进行代码提交。
Git命令
Git安装成功之后,在命令行输入Git,会有如下的列表:
可以看到,这里已经列出来了所有关于Git的命令。当然这里面所有的命令都是 git 开头的。
在这里我提前说下,我强烈建议每一个开发者都有一个叫做dev的文件夹。这个文件夹里面放着我们所有的开发代码,包括其他关于技术的文件。这样做的好处有很多,比如说某天我们需要计算下这辈子写了多少行代码,我们只需要通过一些代码行计算工具针对这个dev文件夹做一次查找就好了。
接下来,我通过操作来讲解几个常用的命令:
第一步,我们创建一个文件夹HelloGit。
创建好对应的仓库文件夹,并进入这个文件夹之后,我们来试下Git操作。比如Git status(查看当前仓库的状态)
会看到提示,当前目录还不是一个Git仓库。
那么这时候我们就得初始化这个仓库了。
git init
这个命令就代表初始化git仓库。
这时候就会看到成功的初始化了一个空的Git仓库。
git status
接下来,我们继续用git status来查看下当前仓库的状态。
就会看到标红的文件,这个意思就是这个文件还没有被add到当前的仓库栈中。
所以接下来我们通过git add 来添加这个文件。
git add
这时候,再通过git status 来查看,会发现这个文件已经成功被添加。
同时,我们还可以通过 git rm --cached 来移除这次添加,移除之后就又会回到上一步未添加的状态。
接下来我们通过 git commit 来做提交,当然这里只是提交到本地。
git commit
将当前add到仓库栈的所有文件进行一次本地提交。
记住,这里是本地提交,并非提交到远端。这个命令也是很多开发者容易误解的。
因此,我们通过 git commit -m '第一次提交' 。 -m 后面紧跟这次提交的内容描述。
git log
这个命令就很简单了,是查看当前本地仓库的提交记录(日志)
这里可以看到几条重要的信息。
这里我多扯一句,一定要保证自己每次add - > commit 操作的文件粒度要足够小。足够小的意思就是,比如有5个文件没有add,但是这个5个文件包含了两个功能,功能1是增加了登录功能,功能2是修改了验证码的Bug。那么你就得把这5个文件分成两次进行提交,add -> commit 。并且 commit 的-m后紧跟着对应的功能描述。
这样做的好处就是,某天你发现登录模块有问题,那么你可以直接去看关于登录功能的那次提交,而且这次提交的登录功能没有其他代码的干扰。
git branch
branch其实就是分支的意思。分支在git中起了举足轻重的作用。
有点git基础的都知道有个master分支。而且这个分支,必须保存的是我们稳定的代码。那么我们去哪里开发呢?
我们可以git branch 一个 dev分支。团队可以在这个分支进行工作,等代码稳定之后我们再将dev合并到master支。
其次,分支提供了我们并行开发的良好环境。
比如整个团队只有一两个人开发登录模块,但是又不能影响其他人,同时自己还要做代码的版本管理。那么我们就可以通过git branch 一个 login 的分支。这样,我们可以在这个分支做登录的开发,等代码稳定之后,再将代码合并到dev分支。
git checkout login
创建好分支之后,我们通过git checkout 到对应的分支。当然我这里是直接基于master来切出来的一个分支。意思就是,我login的代码是从master复制过来的。在实际开发中,你可能需要从dev来切出来。以减少后期合并的工作量。
git merge
上面说了很多合并的东西。那么实际是怎么操作的呢?
比如我们在login分支开发稳定了登录模块,我们现在想把代码合并dev。那么我们就可以先git checkout dev,这样,我们的仓库环境就会切到dev分支,然后 git merge login。 就可以把login分支的代码合并过来。
同理,将dev合并到master分支,也是首先切换到master分支,然后再merge dev。
当然,在你做合并的时候,会出现很多代码冲突。这时候,就需要你来解决。如果出现,不明白的代码冲突,那么一定要去问提交这块代码的人,如何解决这个冲突。切勿,自己乱删,这样会导致删除别人有用的代码。
git branch -D
这个命令就很简单,是直接删除某个分支。当然你得先checkout到其他分支。因为你不能在login分支,然后执行git branch -D login。 这样是没办法删除掉login的。
git tag
这个命令一定要养成习惯。当我们每一次提交测试之后,我们都需要对当前代码打一次tag。这样在后期bug排查的时候,可以很容易找到出现问题的代码。
当然,命令就很简单了。git tag 加上对应的版本号。同时切换到对应tag的代码也很简单。 直接 git checkout + 版本号,就可以了。
总结
以上全是一些最基础的Git知识和操作。
同时也都是本地的版本管理,并没有涉及到远端仓库,也就是最重要的一个命令 git push。
所以,下一篇,我将讲解git push的操作和Github上其他的高阶玩法,包括其他一些我常用的高阶命令。