前言:目前的公司的开发技术还是处于刀耕火种的年代,react,vue已经火到不行了,可是还在用jQuery一遍遍处理着dom。版本控制用的是svn,这里也不是说svn不好,在windows下svn的“傻瓜式操作”非常的简单,对于开发人数很少的团队,也够用,但是如果开发人数比较多,开发交叉比较大的情况下,git的优势就非常明显。
一,SVN
(1)svn的操作比较简单,官网上下载安装完之后,在空白处鼠标,如下图就表示安装成功了
(2)导出,从远程库导到本地
这里下载的是汉化版的,填好远程库和本地地址之后,点确定即可导到本地。这里直接讲到客户端的操作,因为没在服务器建立仓库的经验啊
(3)右键,点设置
我们可以看到svn也可以设置分支。但是要注意这个分支实际是一个完整的目录,当你新建一个分支的时候,每个人都会拥有这个分支
(4)进入下载到的本地库文件里,右键,我们可以看到有,SVN更新和SVN提交的选项。在提交之前先更新,然后手动处理冲突之后再提交即可
总之,svn的图形化操作非常的简单,其他的一些操作这里就不去详解了,毕竟这篇的重点是git,还是稍稍总结一下svn和git的区别,以及为什么要转为git,git的好处在哪里?
二,svn和git的区别
其实我是先接触git的,所以刚到公司用svn的时候我心里是有些拒绝的。直到有一天在知乎上看到一个回答,终于理解了为什么很多公司倾向于svn
svn:集中式版本控制,只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。这也是最大的缺陷,如果服务器宕机,将影响到所有的开发人员,而且如果中心服务器的磁盘坏掉,如果代码没有备份的话,就相当麻烦了。即使把本地代码进行合并得到一个相对完整的本本,再把这个代码重新部署到服务器的新仓库时,会丢失所有的历史版本以及日志。
svn必须要联网才能工作
svn是按文件的方式来存储的,关心的是文件内容的具体差异
svn提交的时候必须授权,如果没有写权限,提交会失败
svn提交并非每次都能成功,先更新再提交,先提交的会与后提交的发生冲突。
当然,用svn我们可以看到项目中其他人的开发进度,这便于领导管理。
git:分布式版本控制,首先git也是有自己的集中式版本库和服务器,但它更倾向于分布式模式。每个开发人员从中心版本库/服务器上check out代码克隆一份到自己的机器上。客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。每一次的提取操作,实际上都是一次对代码仓库的完整备份。每一个开发人员的电脑上都有一个Local Repository,所以即使没有网络也一样可以Commit,查看历史版本记录,创建项 目分支等操作,等网络再次连接上Push到Server端。
git是把内容按元数据方式存储,不保存前后变化的差异数据,若文件没有变化,git不会再次保存,只对上次保存的快照做一个链接。
git每个clone的版本库都是平等的
git的提交不会被打断,push给他人或者他人pull你的版本库,合并会发生在pull和push的过程中,不能自动解决的冲突会提示手工完成。
git没有一个全局版本号,但是svn是有的
git每个历史版本都存储完整文件,便于恢复,svn存储差异文件,历史版本不可恢复
三,git多人协作开发流程
首先在windows下安装git,直接在官网上安装,next默认安装即可。
因为git的分布式,安装完之后,还需要进一步设置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意:git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
(1)创建版本库,并把目录变成git可以管理的仓库
$ mkdir test
$ cd test
$ pwd //用于显示当前目录
$ git init
(2)把文件添加到暂存区
$ git add readme.txt
(3)把暂存区文件提交到仓库
$ git commit -m "write a readme file"
-m
后面输入的是本次提交的说明,可以输入任意内容
commit可以一次提交多个add的文件
(4)查看仓库当前状态
$ git status
可以看到文件被修改了(没有被提交),但是要看具体修改了什么内容,用以下命令:
$ git diff readme.txt
(5)版本回退
如果文件改错,或者误删,可以从最近的一个commit恢复
在这之前:我们可以用以下命令查看提交记录,由近到远,如果嫌输出信息太多,可以试试加上--pretty=oneline
参数:
$ git log
界面上显示的一大串数字就是commit id(版本号)
在git中,用HEAD表示当前版本,上一个版本HEAD^,再上一个版本HEAD^^
$ git reset --hard HEAD^
如果你已经版本回退,但是后悔了,只要找到版本id,例如3628164(不用写全,也不能太短),回退到指定版本
$ git reset --hard 3628164
如果把界面关闭,该如何查找版本id,如下的命令会记录你的每一次命令
$ git reflog
(6) 查看工作区和版本库里最新版本的区别
$ git diff HEAD -- readme.txt
(7)撤销修改
1.撤销工作区的修改,让这个文件回到最近一次git commit
或git add
时的状态。
$ git checkout -- readme.txt
注意:-- 这个很重要,没有的话就变成切换分支
2.已经git add到暂存区,还没有提交。用以下命令把暂存区的修改撤销掉
$ git reset HEAD readme.txt
3.如果已经提交到版本库,可以用版本回退
(8)删除文件
1.从版本库中删除文件
$ git rm test.txt
2.从工作区中误删,版本库中还有
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
(9)添加远程库(github)
1.把本地库与远程库关联
$ git remote add origin git@github.com:michaelliao/learngit.git
远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的。
2.把本地库的内容推送到远程,
$ git push -u origin master
第一次推送master
分支时,加上了-u
参数
只要本地作了提交,就可以通过命令:
$ git push origin master
3.从远程库克隆到本地
$ git clone git@github.com:michaelliao/gitskills.git
Git支持多种协议,默认的git://
使用ssh,但也可以使用https
等其他协议。
(10)创建与合并分支
1.创建分支dev
$ git checkout -b dev
加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev //创建
$ git checkout dev //切换
查看当前分支:会列出所有分支,当前分支前面会标一个*
号。
$ git branch
把dev分支的工作合并到master主分支(此时master是当前分支)
$ git merge dev
合并完之后,就可以删除分支dev
$ git branch -d dev
(11)解决冲突
当不同分支修改了同一个文件合并时,会发生冲突,Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容
把需要修改的分支修改后重新提交
用以下参数查看分支的合并情况(分支合并图):
$ git log --graph --pretty=oneline --abbrev-commit
(12)分支策略
master主分支应该仅用来发布新版本
在dev分支上干活,每个人都在自己的分支修改代码,时不时的在dev分支上合并