资料备份管理
没用过版本控制系统的,开发过程中,每天copy一份来备份代码或其他文档,间歇性拿移动硬盘copy备份代码。
- PM说改回之前什么需求的代码,然后就开始找代码,不记得就每个工程打开,看代码是否符合要求
- 今天下午代码写错了,测试有bug,想还原到上午的代码,只能凭记忆慢慢删除下午添加的代码,或copy昨天的代码,拿出来重新慢慢添加今天新增的代码
- 多人一起开发一个项目,怎么合并代码?
- 项目有多个功能需求,分2次上线,同时开发,需求1部分需要第一期上线,需求2部分第二期上线,但是同时开发,代码如何管理
- 想查看最近都修改了那些代码,如何找记录
- 各种项目office文档在项目群里面满天飞,如何统一管理
git就是解决这些问题的一种解决方案
what it is
git是一种版本控制系统,版本控制系统是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统,有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节,查出最 后是谁修改了哪个地方,从而导致出现怪异问题,又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改 的改删的删,你也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。
看下面git客户端sourectree的一个截图,可以记录每次提交的时间,描述说明,作者,修改了那些文件,修改的内容对比等等
本地版本控制系统
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。
为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。
集中化的版本控制系统
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion(SVN) 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这 已成为版本控制系统的标准做法(见图 1-2)。
这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做最显而易见的缺点是**服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要 是**服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就还是会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端 提取出来的某些快照数据除外,但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项 目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
分布式版本控制系统
于是分布式版本控制系统( Distributed Version Control System,简称 DVCS )面世了。在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份(见图 1-3)。
更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。
why git
实际使用中,使用git(分布式版本控制系统)和svn(集中式版本控制系统)比较多,这里再一次集中比较一下优劣
本地仓储
-
svn :本地开发版本+远端版本库
-
git: 本地开发版本+本地版本库+远端版本库,可以本地提交代码,提供了暂存区,可以方便指定提交内容,而不是全部
分支管理
-
svn:无本地分支
-
git:有本地分支
代码合并
-
git:代码合并相对容易,冲突容易可通过第三方工具编辑解决。
-
svn: 冲突比较难解决,如重命名(无论文件还有目录)提交后,你本地/或是分支上 有文件重命名前的这些文件的修改或提交,在做合并操作时,你会碰上传说中难搞的树冲突!
查看日志
-
git: 本地包含完整日志
-
svn: 需要从服务器拉取
git VS svn参考
how use it
本篇主要介绍git客户端sourcetree的使用,git详细知识原理等请参考文章最后的参考资料(熟悉git原理和常用命令可以使用更多git功能)
souretree使用介绍
本篇主要使用windows环境操作souretree,mac环境操作基本一样,souretree界面布局有少许差别。
git仓库创建
github上创建一个仓库示例
公司内部gitlab示例
点击New project,内容有项目目录,项目名称,项目描述,项目等级
点击如图中的图标复制SSH路径,然后再sourcetree中clone添加新项目即可。
首次下载(clone)
clone地址为 http或https形式,表示客户端和服务器通信通过账号密码形式 clone地址为git@形式,表示客户端和服务器通信通过SSH形式
仓库文件介绍
.gitignore文件(隐藏文件),表示忽略哪些文件或文件夹,不用记录到版本控制仓库 .git文件夹(隐藏文件夹) 仓库文件夹,本地版本仓库
新建2个文件,暂存提交(可以选择部分暂存提交,方便更细的写代码修改记录)
提交后会有个推送的提示(项目新clone首次修改提交存在不显示推送提示bug,可主动点击推送)
多人开发
多人合作开发一个项目的时候,难免会遇到修改冲突的时候,这个时候合并代码的时候就需要解决冲突,如果没有好的工具,只能手动修改,或者以谁为准,然后再添加另外一个人的代码上去。
冲突解决工具Beyond Compare
Beyond Compare是一款优秀的文件比对工具,这里使用它来帮我们解决冲突问题。 souretree设置外部比对工具,选择Beyond Compare mac OS:偏好设置,选择Diff
windows端: 工具->选项->比较
冲突操作示例 以mac下的souretree示例,windows类似
BeyondCompare工具打开的冲突对比编辑窗口
图中标注的1
、2
、3
分别表示
1
: 本地的代码2
:远程代码3
:默认显示的远程代码,可通过右下角选项,选择某项操作后,然后编辑下方代码,也可以直接编辑
对3
编辑完成后,按保存快捷键 ctrl+s(mac:cmd+s),然后检查souretree中冲突代码是否修改正确,然后右冲突文件(有感叹号)右键,标记为已解决,后缀为 orig的文件为解决冲突生成的临时文件,右键选择移除即可。
恢复到历史版本
提交回滚操作适合在最新的提交记录上面提交回滚,否则选中的记录提交回滚之后会提示很多和之前的版本文件冲突,很麻烦,这个时候可以选择重置到这次提交系列操作方案。
step1
选中某次需要恢复的提交,右键选择 "将master重置到这次提交" (master为当前分支)
然后选择如下图的使用模式
step2
step1完成后,只是本地分支内容恢复到我们想要的历史记录,远程代码没变,所以显示落后2个版本,在最新提交上右键,选择重置到这次提交
然后选择如图所示的
会出现需要新提交的改变内容,其实就删除了这个历史版本之后提交的代码,提交后即完成恢复到历史版本的目的,可以注意到,这套操作不会改变提交记录。
分支
一般仓库默认有个主分支master,可以基于某个提交任意创建新分支。(可以类比为某个提交为基类,新分支为子类,子类继承了基类的所有,新建很多分支,就是新建了很多子类,子类互不干扰。)
新建分支
创建后只是本地创建了分支,需要操作推送到远程服务器端
删除分支
不能删除当前显示的分支
分支合并
先切换到最终合并的分支,然后选择需要合并的提交记录,右键选择合并,合并的时候如果有冲突,会有提示,使用第三方工具解决即可。
标签
tag(标签)就是对某次commit提交记录(可能比较重要的时间点,比如某次上线代码)一个标签,方便将来查找 选择某次commit,右键选择标签
然后填写标签名称和勾选推送标签后,点击按钮添加标签
即可
如何查看tag 左侧标签列表或右侧跳转到均可以