## **概念及必要性**
在项目开发中,一个好的习惯就是常于备份,而Git就是来帮助我们备份代码的。
也许你遇到这样的情况:你做出了一个软件并上线给到用户在用,用户在用的过程中,哪些功能体验不好,你要去改善,这时候你要在原有的代码【代码文件v1】中做修改但改之前,得做下备份,这时候你就有了备份【代码文件A-v1-backups】的备份文件,当你将用户提给你的这些方面改善好了,这时候你就有了修改后的新文件【代码文件A-v2】,当又有用户觉得其他方面体验不好,你还得改,又多了文件【代码文件A-v3】,依次一直文件v4,v5,v6…直到无限。
这时候问题来了,假如当某一次改动上线后出现严重bug,在时间不允许时,你就得拿出最近一次备份的文件先顶一顶(俗称版本回滚),这个其实还好办。但假如不是最近一次,而是很久之前的,你这时候就需要去文件v1,v2,v3,v4…一个个去找,而此时面对着一堆的文件,你完全想不起来,当初备份的这个是什么,
此时我们就需要用到本章节的内容:版本管理器
目前市面上优秀的版本管理器有两个:
1. 集中式的SVN
2. 分布式的Git
SVN既然是集中式的,有一个统一的文件服务器存放这些文件,每个人单独与之做沟通,但集中式的注定了当作为核心的SVN服务器挂掉之后,所有人都无法在使用。而Git的分布式设计让每个人都有一个完全属于自己的独立仓库,尽管它也有一个中间的交互服务器,但那仅仅只是作为一个中间媒介,当中间节点挂了,你本机有一个完整的代码库,不会对你有过大的影响。
因此,本文档将采用Git作为协同开发中的版本管理器来将讲解如何使用Git
## **1.Git 安装**
参见: 3.2 Git客户端安装过程
## **2. Git使用**
装好Git,我们可以使用纯命令行操作Git,新手建议装个小乌龟TortoiseGit,安装完毕后:
![](https://pic2.zhimg.com/80/v2-624b25056314bf1afcffb0c526405a05_hd.png)
装好Git之后,先来看看Git此类的版本管理工具到底怎么帮我们备份文件的。
备份文件按照常理来说,需要做以下事情:
1、谁备份的?
2、什么时候备份的?
这些不用我们开口Git就帮我们做了。接下来:
3、需要备份哪些文件?
4、备份的这些文件是干嘛用的?
与单人备份有些不同的是,这是多人备份。你有可能你要备份的文件,在你备份之前被别人改过,而你手里的文件暂时没有别人改过的那部分代码,甚至那部分代码你也改了,这样跟假如JavaScript是多线程,操作DOM时,浏览器要听谁一样。这时候,Git要听谁的呢?所以需要:
5、更新别人的代码。
6、看看是否有冲突,处理冲突。
7、你提交代码,Git完成代码备份。
我们一起看一个图:
![](https://pic2.zhimg.com/80/v2-118ae5ac5e8d6d868f8508a99e16901d_hd.png)
好了,你知道Git怎么帮你备份了,那你要做的就是配合它,把流程走完,因为Git就是机器人,而且是不智能的,是不会自主学习和变通的,它只能走流程。
先看一看Git的命令行界面(上面安装完Git之后截图里的那个Git Bush Here)
![](https://pic4.zhimg.com/80/v2-bffc0c178b5e271258b3b05fcc4a4dfb_hd.png)
我们陪它走一遍流程(这里暂不涉及到创建库,删除库,切换分支,回滚等等),因为一般情况下,这些操作是配置管理员的工作,开发人员不会涉及,所以我们直接从克隆一份远程仓库的代码开始,看下图:
![](https://pic4.zhimg.com/80/v2-2998480056e4818976cad475cba7ab9b_hd.png)
这就是最常见的走流程,Git没什么,就是走一个备份的流程。
好了,走完了命令行,这里也来走一下小乌龟(TortoiseGit)。
还是走流程,只不过变成可视化了,你不用敲命令了。
看到刚刚右键菜单的git 克隆了没?点击它。
![](https://pic1.zhimg.com/80/v2-a7897b3c8e83128164a0e038a001e640_hd.png)
输入你的url,这个url就是你gitHub或gitLab上的仓库地址。看一下github的:
![](https://pic1.zhimg.com/80/v2-9b1189416252449b9f8119256683defc_hd.png)
克隆下来了,本地就有了一个仓库。
![](https://pic4.zhimg.com/80/v2-9c7db85bdb9cd3ec7a116e354bd5bcd3_hd.png)
我们顺便可以看一看分支,因为一般情况下,Git会有一个主分支master,你是没有权限提交代码的,还有一个work或者develop分支,这个是给你开发提交代码用的,而master是给管理员最终测试完合并代码用的。
我们这里只有一个master主分支:
![](https://pic4.zhimg.com/80/v2-aaf8457861e4874e3487b74f836d3e5f_hd.png)
好了先不管命令行,开始我们的小乌龟走流程之旅吧。
假设我们新增了ccc.txt文件,同时又修改了里面的bbb文件。变成这样:
![](https://pic3.zhimg.com/80/v2-0fe46ed5635a209d905be2080824e1f6_hd.png)
继续走流程,这时候好像得走到 add 那里了吧?嗯是的。
![](https://pic2.zhimg.com/80/v2-5892c45cffdbee778368d96e6985649d_hd.png)
点击Add。点确定就好了。实际上就是执行一句git add .,看看你新增了哪些文件。
接下来流程走到我们要更新代码看看有没有别人更新了啥对吧?再看看需不需要处理冲突。
也就是fetch和merge。(这两个合起来就是pull)一个个来:
fetch:点击上面的fetch,到这里
![](https://pic2.zhimg.com/80/v2-7fb2b0c7fac2ad8e92087412e013d261_hd.png)
嗯行,看看你更新了啥。然后按close关掉界面。
![](https://pic2.zhimg.com/80/v2-faec6572b3008bde66b578510a2a2b2d_hd.png)
这里我们刚刚才clone下来的,所以没啥其他别人的代码。
接下来就开始合并了,将我们的代码先在本地仓库进行合并(这里没其他人代码不用处理冲突。),记得勾选no commit,先别提交我们的commit,最后一步再commit
![](https://pic2.zhimg.com/80/v2-79fa2f1c17429c7fdb0ad06fea4a89d9_hd.png)
好了之后,看到是最新的,无需处理冲突。这时候点commit。
![](https://pic2.zhimg.com/80/v2-fddb319ea7c5b8802e27fc16aebd16ad_hd.png)
这里还记得上面的git commit -m ‘你这些备份的文件是干嘛的’。这时候你就要写你干了啥了。
![](https://pic1.zhimg.com/80/v2-d8fd22183cfc00bda474f572020cca50_hd.png)
将我们这些文件是用来干嘛的告诉Git之后,是不是就剩一个流程,那就是提交了?
![](https://pic4.zhimg.com/80/v2-3e4a84120d74639c96e5da8a341e133f_hd.png)
点击这个push,push就是推,推送的意思。
![](https://pic3.zhimg.com/80/v2-da2d514324df31fe67e4f525984997aa_hd.png)
这样我们就完成了我们的推送,看一下远程仓库已经更新。
![](https://pic2.zhimg.com/80/v2-aeec336f58debeaf193755304725da0d_hd.png)
这样我们就完成了整一个的克隆、更新、提交代码的流程。gitLab也是一样的。