版本控制SVN与GIT

版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。项目在开发过程中要用到相应的配置管理工具对配置项(包括各个阶段的产物)进行变更控制,配置管理的使用取决于项目规模和复杂性及风险的水平。软件的规模越大,配置管理就越显得重要。
版本控制工具我学习过SVN和GIT,以下对他们进行一些总结。

一、SVN的基本概念

SVN 是一个开源的版本控制系統, 有一个中央资料档案库(配置库),管理着文件每一次的变动。在这里插入图片描述
reporitory(版本库) : 源代码统一存放的地方;
Checkout(提取):当你手上没有源代码的时候,你需要从版本库checkout一份;
Commit(提交):当你已经修改了代码,你就需要Commit到版本库;
Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和版本库上的源代码同步,你手上的代码就会有最新的变更;
*如果两个程序员同时修改了同一个文件呢, SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN会提示文件Confict, 冲突,需要手动确认。
客户安装必须跟随服务器安装,无服务器无法单独工作。

二、Git

git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小项目,它与CVS,SVN不同,它采用了分布式版本库的方式,不必服务器端软件支持。

分布式版本控制比集中式版本控制的优点:可避免单点故障。
单点故障:例在SVN中,若服务器崩溃了,客户端上只有当前的数据,不能得到服务器上的全部数据和历史记录了。

1、Git与SVN的区别:

1):Git是分布式的,SVN是集中式的;这是Git与其他非分布式的版本控制系统最核心的区别;
2):Git把内容按元数据方式存储,SVN是按文件存储,所以的资源控制系统都是把文件的元信息隐藏在一个类似 .svn , .cvs等的文件里;
3):版本管理:SVN采用的是增量式管理方式(只保存每一次有修改的部分历史),Git采用文件系统快照;
4):Git分支与SVN不同,分支在SVN中一点也不特别,就是版本库中的另外一个目录;分支在Git中地位十分重要;(当Git创建一个分支时,只是创建一个指针;而SVN则是把所以文件目录都复制一遍)
5):Git的内容完整性要优于SVN,Git的内容存储使用的是SHA-1哈希算法,这能确保代码内容的完整性;
6):Git没有一个全局的版本号,而SVN有,这是跟SVN相比Git缺少的最大的一个特征;

2、Git的三棵“树”----工作区,暂存区,版本库

*工作区:你的工作副本,就是你电脑上能看到的目录;
*暂存区:(stage,index):一般存放在 .git目录下的index文件中;
*版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是git的版本库;

3、Git和代码托管中心

代码托管中心的任务:维护远程库。
1)局域网环境下:GitLab服务器
2)外网环境下:GitHub,码云

4、本地库与远程库的交互

1)团队内部协作
在这里插入图片描述
2)跨团队协作
在这里插入图片描述

5、Git命令行操作之本地库操作

1)git init:初始化一个git库。
在这里插入图片描述
a、创建一个目录作为我的git仓库;
在这里插入图片描述
b、进入到我的仓库中
在这里插入图片描述
c、初始化我的git库
(注:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要修改)

2)git status:查看状态
在这里插入图片描述
刚创建了一个空的git库,什么文件也没有写,所以这里是No commit yet(目前没有提交任何东西);nothing to commit(也没有什么可提交的);

3)git add 文件名:将文件放入暂存区

在这里插入图片描述
a、新建了一个文件abc.txt,但还未提交,此时文件被标记为红色;
在这里插入图片描述
b、使用add将文件放入暂存区;再查看状态,文件变为绿色;
在这里插入图片描述
4)git commit 文件名:将暂存区中的文件上传至版本库;
在这里插入图片描述
在提交时直接写上提交的附加信息,这样不用打开vim编辑器

5)git log :版本历史记录
a、git log - -pretty=oneline :每条记录只显示一行
b、git log - -oneline
c、git reflog:(此种显示方法,对于移动指针HEAD有很大作用)
HEAD @{移动到当前版本需要多少步}

6)前进后退
每一条历史记录都对应有一个唯一的哈希值
a、基于索引值:git reset - - hard 索引值(推荐使用);
b、使用^符号(只能往后退)
git reset - - hard HEAD^ (退一步)
git reset - - hard HEAD^^ (退2步)
git reset - - hard HEAD~3 (退3步)……以此类推;

7)删除文件:rm 文件名

8)diff:比较文件差异
a、git diff 文件名:将工作区中的文件和暂存区的进行比较;
b、git diff [本地库中的历史版本] (文件名):将工作区中的文件和本地库历史记录比较;
c、不带文件比较多个文件;

9)设置签名

作用:区分不同开发人员的身份。

辨析:这里设置的签名和登录远程库(代码托管中心)的账户,密码没有任何关系;

命令:a、项目级别/仓库级别:仅在当前本地库范围内有效;
git config user.name 用户名;
git config user.email 邮箱;

b、系统用户级别:登录当前操作系统的用户范围;
git config - - global user.name 用户名;
git config - - global user.email 邮箱;

级别优先级:
就近原则:项目级别优先级高于系统用户级别,二者都有时采用项目级别;
二者都没有是不允许的。

6、分支管理

在这里插入图片描述
1)什么是分支?
在版本控制过程中,使用多条线同时推进多个任务。

2)分支的好处:
a、同时并行推进多个功能开发,提高开发效率;
b、各个分支在开发过程中,如果某个分支开发失败,不会影响其他分支;失败的分支删除重来即可;

3)与分支有关的操作
a、查看分支:git branch --v;
b、创建分支:git branch 分支名;
c、删除分支:git branch --d 分支名;
d、切换分支:git checkout 分支名;
e、合并分支:首先切换到接受修改的分支上;
再执行merge命令:git merge 要合并的子分支名;
f、解决合并时发生的冲突:
*编辑文件删除特殊符号;
*把文件修改到满意的程度;
*git add 文件名;
*git commit --m“日志信息” (注:此时提交不能带文件名)

7、本地库与远程库交互

1)git remote add origin [远程库的地址];(origin,你创建的别名,因为远程库地址很长,先为他创建一个别名);
2)推送:git push origin 分支名;要推送到哪个分支上;
3)克隆:git clone 远程库的地址
特点:a、完整地把远程库下载到本地;
b、创建origin远程库地址别名;
c、初始化本地库;
4)加入团队;
5)pull;

8、push到远程库时冲突

如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取。拉取下来后如果进入冲突,则按照“分支冲突解决”操作。