1. 代码的版本控制程序
1. 版本控制程序是什么?
在我们写代码的时候,往往会把这些代码提交到服务器上,为什么需要提交呢?
如果是一个人去做的话用不着传到服务器上,但是如果是很多人同时协作写一个比较复杂的系统,那么每一个人都会有自己的分工,那么这么多人写的代码该怎样去合并、怎样去方便的管理呢?
这时候就需要用到版本控制工具,一般来说我们用的比较多的是 SVN 和 GIT
SVN 他属于一种有中心的,就是中心服务器
GIT 属于分布式的管理工具
2. 版本控制工具
一般来说 SVN 和 GIT 我们使用的都是客户端,客户端也是分操作系统的
- SVN 操作工具
如果你用的是 MAC 或者 Linux 强烈建议你使用命令行,用 MAC 的话也是有一些图形管理工具的,像 SVN 的客户端,但是要么是收费的、要么就是不好用的,相对来说还是命令行更好用一些
如果是 Windows 下选择就会相对的多一点,当然你也可以用命令行,也可以用图形界面的
图形界面中有一个比较好用的就是 tortoisesvn 小海龟,它可以跟你的资源管理器进行无缝的整合,也就是说你的文件和它的源代码的各种状态(是提交过的,还是修改过的、冲突的等等)都可以在你的资源管理器下看得到,它和你的资源管理器整合的非常好,而且他还可以把很多的功能加到你的右键菜单里,如果你想要提高工作效率的话就可以用这个 小海龟 ,它是英文版的你也可以下载一个中文版,改成中文版的
下图是下载页面,下载 64 位的
下面的是下载相应的语言包, Chinese,simplified 64 bin 后面的 PDF 是操作手册 -- 他里面不仅仅是操作手册还有它的内部管理机制,以及很多其他的使用的套路
Linux 下安装客户端和服务器端(因为他们被整合到了一起)
//centos
yum install svn
//ubuntu
apt-get install svn
![image.png](http://upload-images.jianshu.io/upload_images/6264932-6e8819d637bcb908.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
//用这个命令就可以来操作这个客户端了
svnadmin
//查看相关的命令
svnadmin --help
![image.png](http://upload-images.jianshu.io/upload_images/6264932-0a517a4b535f3616.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上图中的 create 命令就是创建版本库的
//create 后面加的是你想要创建的版本仓库的名字
svnadmin create "testdemo"
> windows 下可以下载 VisualSVN 用来搭建 svn 服务器
> 教程链接:[Windows下VisualSVN Server的安装与配置方法(图文)](https://link.jianshu.com?t=http://www.jb51.net/article/71815.htm)
2. 另外一个版本操作工具 -- GIT
> GIT 是从 github 上来的,它是全球最大的程序员交流网站,只要是程序员一般都得有一个 github 账号的,在 github 网站上可以很方便的创建自己的源码仓库,自动化部署的话就可以使用到 github
> 自动化部署就是:你写完代码将代码提交到版本库里,然后先做一个自动化的集成测试,做完自动化测试,所有测试全都通过之后,再把你的代码 push 到生产服务器上去,那么你的源代码就可以在 github 或者 svn 上管理
> 怎么去进行自动化测试和自动化部署呢?
> 我们就需要用到工具 [jenkins](https://link.jianshu.com?t=https://jenkins.io/) 或者是 [travis ci](https://link.jianshu.com?t=https://www.travis-ci.org/)
> jenkins 是支持 svn 的
> travis ci 只支持 git,严格来说只支持 github
> 同时 git 也是有服务器的,在你注册之后,它会给你签发一个证书,供你使用命令行
> 登录 -> 头像 -> Settings -> SSH and GPG keys -> SSh keys 在这里就可以拿到你的类似于上个案例中 免密登录时 使用的证书,拿到这个证书之后就可以在客户端通过 `git` 命令来管理你的 github 上的源码了
![image.png](http://upload-images.jianshu.io/upload_images/6264932-4d795ebad2edbcb1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](http://upload-images.jianshu.io/upload_images/6264932-bf47dde80d9d042c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image.png](http://upload-images.jianshu.io/upload_images/6264932-bf44be76904d3886.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> GIT 也是有客户端的,而且也是非常好用的
> 比如官方的
![image.png](http://upload-images.jianshu.io/upload_images/6264932-7bface87340da1f1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3. SVN 和 GIT 的操作命令
SVN
> SVN 的使用命令就是 `svn` ,我们可以通过 `svn help` 来查看它的子命令,下面的命令都是 `svn` 的子命令,在需要执行的时候都需要先敲 `svn` 之后才能敲子命令
svn help
**SVN 常用的命令**
`checkout` 迁出代码命令,是将你的服务器上的代码复制你本地的开发机上去
// svn:// 指的是搭建 svn 服务器时使用的 svn 协议 具体的协议需要问搭建服务的那位 协议可以是 http || https
//协议 // 后面的是你的这个 svn 服务器的 IP 或者是域名 如果说 svn 的端口没有改是默认的就不用去管他 如果端口变了需要你手动填端口号
// IP 后面跟的是你的仓库的名称 一般来说项目就是仓库
svn checkout svn://192.168.x.x/testdemo
//下一步如果是首次的话会让你输入你的账号 口令(就是密码)
//当然你也可以在命令行上将你的用户 口令加上,但是不建议在命令行中加 口令(password)这样会让别人看到,一般的话只加用户名 也可以像上面一样什么都不加 你需要登录的时候他会问你
svn checkout svn://192.168.x.x/testdemo --username xiaochuan --password xxxx
//这个时候进入你迁出的项目目录中
cd testdemo
//查看文件 会发现有一个 .svn 目录,它是用来维护你的本地管理,做你本地和服务器之间同步用的
ls -a
`export` 导出代码命令
> 导出代码命令和迁出代码命令差不多,它也是将你的服务器上的代码拿到本地
> 但是有一个区别:迁出代码,你的代码是纳入到版本管理机制当中去的,而且在你迁出之后的这个 testdemo 目录下会有一个隐藏的 .svn 目录,这个 .svn 目录是用来维护你的本地管理,做你本地和服务器之间同步用的
> 但是当我们实际的去部署或者编译的时候,比如:我们用 Node 的代码部署的时候,里面带 .svn 这个东西的话是很怪异的,而且 这个目录里面的东西还是挺多的,当我们手动去上传服务器的时候,他会浪费我们的时间,这个时候我们就需要使用导出代码命令来导出一个不带 .svn 目录的干净的代码
//export 就是导出命令 checkout 命令是本地和服务器同步的带版本信息的 export 是将不带版本信息的干净的代码拉到你的本地来的,你如果是修改了这个导出的代码是无法提交的它是一份干干净净的代码
svn export svn://192.168.x.x/testdemo
//这个时候去查看就会发现没有 .svn 目录了
ls -a
`import` || `add` 导入命令
> 它是在我们的开发机里面去创建一个新的版本库
> 实际上你想要创建一个库,首先你需要创建一个目录,然后要用 `add` 命令把它加到你的 svn 的库当中去,如果你不想这么麻烦的话,可以用 `import` 命令,我们可以用 `import` 子命令直接去加到一个版本中,也可以先创建一个文件夹,然后用 `add` 将你的文件夹加入到已有的版本库中去,这是两个套路,但是建议你要创建一个新的版本库的话用 `import` 命令
其他的是一些不常用的命令,我们只要知道这些子命令是干什么的就可以了:
`add` 命令
> 用在 你已经有版本库了,需要往版本库当中添加新的东西
//add 后面的是你要加入到版本库中的文件或者是目录名
svn add test
`auth` 命令
> 他就是让你去登录的,有时你在 svn 下你要切换到另一个服务器下,你可以用 `auth` 这个命令不太常用
`changelist` 命令
> 这个命令是检查你某个文件的修改记录
`cleanup` 清查命令
`commit` 命令
> 这是一个非常重要的命令,当我们做某些修改的时候,一定要记住,做完修改一定要 `commit` 提交
> 他在哪些情况下要用呢?
> 往你的版本库添加了新的文件,然后你再 `commit` 提交,这个时候你的修改才会真正的体现在服务器上去,否则你只是在本地修改
> 为什么要有 `commit` ?
> 就是要让你的本地和服务器进行同步,可以把 `commit` 就理解为同步,就是告诉服务器同步一下,把你本地的差异同步到服务器上去
`copy` 在 svn 环境下的复制命令
`delete` 从版本库中删掉某个文件
`diff` 命令
> 这个命令就是比较差异
> 有的时候我们可能两个或者多个程序员要去修改一个文件,这样的话就会造成修改的内容不一致,每个人那里都会有一个版本,那么谁先提交就以谁的为准,但是如果别人提交了,你还没有提交,在你提交的时候就会发生版本冲突,发生冲突了之后,你的本地会产生三个文件:
> 一个是你自己维护的代码文件,还有一个是别人提交的代码文件,第三个文件是你在修改之前的那个代码文件;
> 有这三个文件你就可以用 `diff` 这个命令去比较你的代码文件究竟哪里有差异,它是用来比较文件差异的
`help` 就是列出当前的 svn 环境下的子命令的命令
`info` 显示信息的命令
`list` 命令
> 列出你当前路径下有哪些文件,当前路径指的是以服务器版本为准的路径,并不是以本地为准的,需要注意差异
> 我们在使用 svn 和 git 的时候,他都是分两端的,第一端是本地的,第二端是远程的,远程的可以是服务器也可以是别人的 git
`lock` 命令
> 它是用来锁定文件的
> 比如说:一个代码文件是公共的代码文件,你需要修改它,修改它的同时你又害怕引发冲突,这个时候你就可以和你的同事约定好,谁修改公共文件的时候谁把这个公共文件给锁定,别人会看到这个文件锁定了他们就不能对其进行操作了,在你修改完之后你需要使用 `unlock` 命令对其进行解锁,这两个命令是成对的,锁定了就意味着别人不能操作这个文件,当你操作完了之后一定要记得把他 `unlock` 了,不然的话别人就没办法干活了
`log` 这个就是日志命令
`merge` 命令
> 他就是生成一个版本冲突的报告文件来
> 这个文件就是一个报告,报告的是当你发生版本冲突的时候有哪些地方是被修改过的
`update` 命令
> 这个也是比较重要的命令,它就是和服务器那边进行一个同步
> 这个和 `checkout` 不一样,`checkout` 是你的本地没有文件,第一次操作时需要将服务器上的文件迁出到本地来,`update` 这个是你的本地已经迁出过且有文件时使用的同步命令,因为你的本地有代码了,同时别人也会在维护的,别人将代码提交到服务器中了,那么怎么让本地代码与服务器上的保持一致呢?服务器上的是新版本的,本地是旧版本的,这个时候就要用 `uodata` 命令了,保证本地的代码是最新的,`uodate` 不会覆盖你修改之后的代码,只会把服务器上最新的代码拿过来
**GIT 常用的命令**
> GIT 的命令和 SVN 命令的套路是差不多的,你会了其中一个,那么另一个基本上也就会了
`git --help` 查看 `git` 命令的子命令
> `git` 的命令集和 `svn` 的有一点差异,差异就在于子命令的样子不太一样,其他的几乎是一样的,可以对照着 `svn` 命令集来比较一下哪些是不一样的
`clone` 克隆命令 这个对应的是 `svn` 中的 `checkout` 迁出命令
`init` 初始化一个本地服务
> 一定要注意的是 SVN 和 GIT 它们的模式是不一样的, SVN 有中心服务器,而 GIT 是没有的,它是分布式的,所以他只有本地和远端,但是 SVN 是有本地和服务器的,SVN 是以服务器为准,GIT 以你分布在各地的最新代码为准,当然这就需要一个人去管理维护他,需要管理维护就需要一个 GIT 服务器来做这件事
> `init` 它是在你本地的仓库当中去初始化一个代码仓库
`add` 和 SVN 中的 `add` 作用是一摸一样的
> 添加一个文件到版本库当中去,同时需要注意的是:GIT 做了这些操作的之后也要使用 `commit` 命令提交的
`mv` 命令
> 移动一个目录到另一个位置,移动的记录要体现到版本库的维护上
`reset` 一般很少用,它是修改 git 源码的状态的
`rm` 在版本库当中删除某个文件夹
![image.png](http://upload-images.jianshu.io/upload_images/6264932-c48bdf9955342bf8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> 下面的命令是 做标记 这个分组里面的
> git 的操作都是体现到版本库当中的, svn 也是只不过它是以服务器为主的,一定要记住的是:不管你是用 git 还是 svn 进行了操作之后一定要使用 `commit` 命令提交
> 在 git 和 svn 中是可以维护代码版本的,这个维护也是有很多的套路的,你每次修改后、提交,它会生成一个新的版本,同时你的项目做到一定程度了,你可以做一个标记(这是一个里程碑之类的东西)
> 还有的就是你要做代码开发的时候,需要在原有的基础上继续做开发,原有的代码是已经结项的,也就是说它是一个已经完成了的项目,你要在已经完成的项目上再进行开发,这个时候你就需要创建一个分支
> 不管是 svn 或者是 git 全都有这个 “创建分支” 的功能,你开发的时候就要在分支上去做开发,这样不去影响你的主干(原来的代码),当你在分支上进行完开发之后,你就需要将这个分支合并到原来的项目中去,然后再打一个标签,这样就非常的条理清晰,不会像从前的那么的混乱
`checkout` 命令
> 这个命令是维护你 git 的分支的,你在你的本地实际上别人从你的 git 仓库去拉代码,就相当于在他本地了
> 分支:本质上来讲他就是当你在做开发的时候,你做的改动不会影响到你原来的代码,因为你原来的代码已经是一个版本了,相当于复制出一份新的代码来,在你新的代码上去做修改,而你原来的代码不动,修改完了以后统一的将你修改好的代码放到原来的代码中去,这样就不会断
`fetch` 命令
> 把别人仓库的索引拿到你这来,别人的仓库里都有什么,它的列表是什么都拿到你这来
`pull` 这个就相当于 svn 中的 `export` 导出代码
`push` 把你本地的修改推到远端
#### 总结:
1. 那我们平时的操作到底是用图形界面还是命令行呢?
> 在平时拿代码或者是简单的提交等等,这些操作就可以用命令行,实际上命令行也是非常方便的
2. IDE
> 平时我们再写代码的时候会用到一些 IDE ,像是 sublime 之类的,这些东西它本身是提供 svn 或者是 git 客户端插件的,也可以用集成到 IDE 当中的客户端插件
> windows 下的话 建议使用 svn ,它和资源管理器结合起来是非常完美的
3. 回顾前端工程化预备知识涉及到的东西:
> 怎么去登陆 Linux 服务器
> 怎么从你本地向服务器复制和从服务器如何把文件拉到你的本地
> 当你登录或操作 Linux 的时候,怎么样用免密的方式来进行操作,注意 Windows 下 和 MAC 或者 Linux 下 是两种不同的方法
> 最后是 SVN 和 GIT 这两种版本控制工具客户端
4. 最重要的是 `scp` 命令
> 这个是命令行的,如果你是习惯使用图形界面的,向服务器进行传输的时候你可以使用 ftp 客户端,但是你不要使用 ftp 协议,因为现在很多的服务器是不开这个 ftp 服务的,因为这个服务他并不是很安全,容易被窃听,只能用加密的链路,那么 ssh 它实际上是一个多用的协议,你可以远程登录,也可以用 ssh 协议进行上传和下载, scp 命令他底层其实用的就是 ssh 协议
5. 另一个比较重要的的地方是 “免密登录”
> 这个在自动部署的时候是一定要用到的
##### 免密登录要分几个步骤:
要生成密钥对
> 一个公钥一个私钥,私钥要保护好,公钥可以进行分发
要使你的公钥在服务器上进行配置
> 也就是说要让服务器能够接受你的私钥
> 配置方法:把你的公钥传到服务器上去之后在服务器的 .ssh 目录下生成一个 authorized_keys 这样的一个文件,把你公钥的内容复制到这个文件当中去,这样你就可以免密登录了
免密登录也有很多的套路,最简单的就是下面的命令
ssh username@192.168.x.x -> 回车
> 前提是你的私钥也一定要放到你本机的 home 目录下的 .ssh 目录中,这个是至关重要的,否则服务器它是找不到你的私钥的,而且你的私钥的权限只能是你自己 可读可写 (600)否则的话在进行 ssh 或者是 scp 命令的时候他会给你报错的,它认为你不安全
最后的就是 svn 和 git
> 它们的套路大体上是一致的,只有某些子命令不一样,不一样的子命令就是如:创建库、向本地同步库这些个操作,其他的命令几乎是一样的