精华内容
参与话题
问答
  • Git_分布式版本控制系统

    万次阅读 2020-08-21 21:36:48
    卸载Git: 先清理git环境变量,然后在控制面板直接卸载即可 基本linux命令: pwd 查看当前目录 clear 清屏 ls 列出所有文件 touch test.txt 创建文件 rm test.txt 删除文件 mkdir ...

    Git 的下载安装

    官网下载:https://git-scm.com/download/win
    淘宝镜像下载:https://npm.taobao.org/mirrors/git-for-windows/

    卸载Git: 先清理git环境变量,然后在控制面板直接卸载即可

    基本linux命令:

    pwd								查看当前目录
    clear							清屏
    ls								列出所有文件
    touch test.txt					创建文件
    rm test.txt						删除文件
    mkdir testdir					创建目录
    rm -r	testdir					删除目录
    mv test.txt a					移动文件
    history							查看历史命令
    git config -l					查看配置
    git config --system --list		查看系统配置		存储目录:Git\etc\gitconfig
    git config --global --list		查看全局配置		存储目录:C:\Users\电脑用户名\.gitconfig
    

    Git 必要配置:

    配置用户名和邮箱
    git config --global user.name "BLUcoding"
    git config --global user.email "2711978737@qq.com"
    

    Git 基本操作:
    Git 本地有三个工作区域:工作目录暂存区本地仓库

    git status					查看文件、文件夹在工作区、暂存区的状态
    git add . 					添加所有文件到暂存区
    git commit -m "提交注释"		提交暂存区的内容到本地仓库
    git push					提交到远程仓库
    
    git pull
    git reset
    git checkout
    

    搭建本地仓库:

    git init
    

    克隆远程仓库:

    git clone https://github.com/BLUcoding/BLUBlog.git
    

    忽略文件:
    在主目录下创建 .gitignore 文件

    #为注释
    *.txt			# 忽略所有.txt文件
    !lib.txt		# 但lib.txt除外
    ignore/*		# 忽略所有名称为ignore目录下的所有文件
    /temp/*			# 忽略根目录下的temp目录下的所有文件
    

    使用码云:

    设置本机绑定SSH公钥,实现免密码登录:

    1. 运行如下命令,一路回车生成私钥和公钥
    ssh-keygen -t rsa
    
    1. C:\Users\电脑用户名\.ssh\ 目录下生成了两个文件:
      在这里插入图片描述
      id_rsa.pub 为公钥文件
      id_rsa 为私钥文件

    2. 在码云安全设置中设置SSH公钥:

    在这里插入图片描述
    4. 使用码云创建仓库:
    在这里插入图片描述
    5. 克隆远程仓库至本地:

    git clone https://gitee.com/blucoding/git01.git
    

    Git分支

    查看本地分支:
    git branch
    查看远程分支:
    git branch -r
    创建分支:
    git branch dev
    创建分支并切换至该分支:
    git checkout -b dev
    合并指定分支至当前分支:
    git merge dev
    删除指定分支:
    git branch -d dev
    删除远程分支:
    git push origin --delete dev
    git branch -dr 
    
    展开全文
  • 版本控制系统

    2019-03-05 10:45:14
    Linux一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 1、集中式版本控制系统 代表:SVN、CVS 版本库是集中存放在中央服务器的,而干活的时候,...

    转载地址:http://www.cnblogs.com/xdl745464047/p/4322530.html

    Linux一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?

    1、集中式版本控制系统

    代表:SVN、CVS

    版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

    在这里插入图片描述

    集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

    2、分布式版本控制系统

    代表:git

    分布式版本控制系统与集中式版本控制系统有何不同呢?

    首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

    和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

    在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

    在这里插入图片描述
      当然,Git的优势不单是不必联网这么简单,Git有极其强大的分支管理,把SVN等远远抛在了后面。

    CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。

    除了免费的外,还有收费的集中式版本控制系统,比如IBM的ClearCase(以前是Rational公司的,被IBM收购了),特点是安装比Windows还大,运行比蜗牛还慢,能用ClearCase的一般是世界500强,他们有个共同的特点是财大气粗,或者人傻钱多。

    微软自己也有一个集中式版本控制系统叫VSS,集成在Visual Studio中。由于其反人类的设计,连微软自己都不好意思用了。

    分布式版本控制系统除了Git以及促使Git诞生的BitKeeper外,还有类似Git的Mercurial和Bazaar等。这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是Git!

    • 集中式:

    优点:(1) 权限系统完善;(2) 提交修改操作简便;
    缺点:(1) 打分支需要联网到服务端;(2) 依赖服务器的稳定性;
    适用场景:(1) 商业软件的开发;(2) 同步需求十分频繁的多人协作

    • 分布式:

    优点:(1) 打分支不需要联网,客户端本地保存着所有历史记录;(2) 不依赖服务器的稳定性,风险分散
    缺点:(1) 同步多人的修改稍繁;(2) 本地代码管理需要十分谨慎;(3) 缺少权限管理系统
    适用场景:(1) 开源软件的开发;(2) 同步需求不频繁或者异地的多人协作。

    展开全文
  • 本课程适合与Windows、Linux和macOS系统,请各位同学不必纠结操作系统版本问题,因为git是跨平台的,任何操作系统版本都一样。 本课程主要介绍了git的基础知识,包括git简介,安装git,克隆git仓库、查看文件...
  •   版本控制系统(Version Control System,VCS)是一种软件,可以帮助软件团队的开发人员协同工作,并存档他们工作的完整历史记录。 为什么 在我们的实际开发过程中,经常会有这种需求或问题 我们需要在已经发布...

    是什么

      版本控制系统(Version Control System,VCS)是一种软件,可以帮助软件团队的开发人员协同工作,并存档他们工作的完整历史记录。

    为什么

    在我们的实际开发过程中,经常会有这种需求或问题

    1. 我们需要在已经发布的程序中添加新的功能,如果测试验证后没有问题,才会使用新的代码,而在测试验证期间,不能影响原来的代码。我们常用的方式应该就是备份多份源代码。这么做唯一的好处就是简单,但是特别容易犯错。
    2. 实际项目开发基本都是多个人合作完成,在多个人写代码时,就牵扯到代码合并成一份的问题。

    历史分类

      纵观版本控制系统的发展历史,《Version Control By Example》一书的作者 Eric Sink 在他的书中对版本控制进行了分类,广义上讲,版本控制工具的历史可以分为三代:

    网络 操作 并发性 示例
    第一代 仅一个文件 锁定的 RCS, SCCS
    第二代 集中式 多文件 提交之前合并 CVS, SourceSafe, Subversion, Team Foundation Server
    第三代 分布式 变更的集合 合并之前提交 Bazaar, Git, Mercurial

    Version Control By Example》可以直接在作者的网站下载电子版(PDF 或 EPUB)

    第一代

      第一代版本控制系统被称为本地版本控制系统。通过加锁将并发执行转换成顺序执行。 一次只能有一个人处理文件。具体流程如下:首先,应该把文件放在一个服务器上,方便使用者上传或下载文件;其次,任何人想对文件修改时,需要先把这个文件加锁,通过checkout指令,使得其他人无法修改;最后,当修改完成之后,需要释放锁,通过checkin指令,形成一个新的版本,存放到服务器端。
      第一代版本控制系统主要有 RCS、SCCS(1972年发布)和 DSEE(被认为是 Atria ClearCase 的前身)。目前,有些项目还在使用!

    悲观锁
      每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。

    第二代

      第二代版本控制系统被称为集中式版本控制系统(Centralized Version Control Systems,CVCS),其对同步修改更加宽容,但有一个明显的限制,用户必须在允许提交之前将当前修订合并到他们的工作中。
    在这里插入图片描述
    由上图可看到,在集中式版本控制系统中,如果服务器嗝屁了,那么所有的开发者就只能干瞪眼了!因为,SVN 对于项目的管理是依赖于服务器中的中心仓库的!我们的更改必须要提交到服务器中的中心仓库。
      第二代版本控制系统主要有 CVS、SourceSafe、Subversion、Team Foundation Server、SVK。

    乐观锁
      每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。
      乐观锁一般会使用版本号机制或 CAS 算法实现。

    第三代

      第三代版本控制系统被称为分布式式版本控制系统(Distributed Version Control Systems,DVCS),其允许合并和提交分开。在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用。
    在这里插入图片描述
    由上图可看到,分布式式版本控制系统也可以有个服务器端的仓库,用来同步各开发者的私有仓库!在分布式版本控制系统中,每个参与者的本地也会有一个完整的仓库。及时服务器端崩溃,我们仍然可以使用 Git(仅在本地仓库管理我们的代码),在网络具备时,再和服务器进行同步即可!
      第三代版本控制系统主要有 Bazaar、Git、Mercurial、BitKeeper,、Monotone。目前,第三代版本控制系统已经大有一同江湖的趋势(具体见 RhodeCode 在 2016 年做过的一项分析报告 Version Control Systems Popularity in 2016)!

    RCS

      修订控制系统(Revision Control System,RCS) 是第一代的版本控制系统。它是一组 UNIX 命令(暂时没有找到有 UI 界面的软件),允许多个用户开发和维护程序代码或文档。
      RCS 于 1982 年由 Purdue University 的 Walter F. Tichy 首次发布。 它是当时流行的源代码控制系统(SCCS,它几乎是第一个版本控制软件工具,早期 Unix 开发人员于1972年开发)的替代工具。 RCS 目前由 GNU 项目维护。GNU 官网介绍:https://www.gnu.org/software/rcs/;项目维护地址:http://savannah.gnu.org/projects/rcs/
      目前,我们可以从GNU RCS 的项目地址: http://savannah.gnu.org/projects/rcs/ 或者 Purdue University 的 RCS 官网 https://www.cs.purdue.edu/homes/trinkle/RCShome/ 下载最新版本的可执行程序、源码、文档。其中,GNU 官网只有源代码,没有预编译的可执行程序。Purdue University 的 RCS 官网倒是有一个旧版本的 Windows 平台的可执行程序。
    在这里插入图片描述

    CVS

      并发版本系统(Concurrent Versions System,CVS)是最初的第二代版本控制系统。大约十年间,它是最为流行的版本控制系统,直到 2000 年被 Subversion 所取代。CVS 的安装教程可以在其项目主页 上找到。由于 CVS 是集中式版本控制系统,所以它有客户端和服务端之区分。但要开始使用 CVS 的话,即使只在你的本地机器上使用,也必须设置 CVS 的服务端。
      CVS 最早是由一位名叫 Dick Grune 的荷兰科学家在 1986 年开发的,当时有一个编译器项目,他正在寻找一种能与其学生合作的方法。我在英文网站 http://dickgrune.com/Programs/CVS.orig/#History 中找到如下一段话:

    I created CVS to be able to cooperate with my students, Erik Baalbergen and Maarten Waage, on the ACK (Amsterdam Compiler Kit) C compiler. The three of us had vastly different schedules (one student was a steady 9-5 worker, the other was irregular, and I could work on the project only in the evenings). Their project ran from July 1984 to August 1985. CVS was initially called cmt, for the obvious reason that it allowed us to commit versions independently.

      Grune 于 1986 年 6 月 23 日公开发布了该代码。CVS 最初仅仅只是一个包装了 RCS( 修订控制系统(Revision Control System)) 的 Shell 脚本集合。最终演变成当前版本的 CVS 的代码始于 1989 年 4 月的 Brian Berliner 的贡献,后来由 Jeff Polk 和许多其他贡献者提供帮助。 Brian Berliner 撰写了一篇论文,介绍了他对 CVS 程序的改进 - 该程序描述了该工具是如何在 Prysma 内部扩展和使用的。 1990 年 11 月 19 日,CVS 1.0 版被提交给自由软件基金会进行开发和分发。

    关于 CVS 的使用可以参考这篇文章:https://zhuanlan.zhihu.com/p/51792519

    VSS

      VSS 的全称为 Visual Source Safe,是美国微软公司出品的版本控制系统。兼容 Check out-Modify-Check in(独占工作模式)与 Copy-Modify-Merge(并行工作模式)。它也属于集中式版本控制系统。
      VSS 通常与微软公司的 Visual Studio 产品同时发布,并且高度集成。VSS 使用文件系统作为存储方式,每次版本变更时就需要大量地读写硬盘。这也是 VSS 最广受垢弊的缺点。VSS2005 拥有Web 访问功能,不再与 Visual Studio 同时发布。
      2008 年,微软发布了 Team Foundation Server 的项目生命期管理工具,以替代 VSS。其不仅仅包含版本控制系统,还包括一系列的项目生命期管理工具。此中使用的还是集中式版本控制系统。

    • Team Foundation Server:本地版本,用户安装使用!
    • Team Foundation Service:云端版本,使用微软账户登录!

      2019 年,微软发布了全新的 Azure DevOps Server。这不仅仅是个改名,整个软件的架构都进行了重新的调整!有了它,我们就可以使用一系列的项目生命期管理工具。版本控制系统仅仅是其中的一小部分。注意其中的版本控制系统是基于 Git 的分布式版本控制系统。

    • Azure DevOps Server:本地版本,用户安装使用!是 Team Foundation Server 的升级版本。
    • Azure DevOps Service:云端版本,使用微软账户登录!是 Team Foundation Service 的升级版本。

    SVN

      SVN(Subversion 的缩写)是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统。SVN 由 CollabNet 公司于 2000 年资助并发起开发,目的是创建一个更好用的版本控制系统以取代 CVS。
      2000 年 2 月,CollabNet 联系了 Open Source Development with CVS(Coriolis, 1999)的作者 Karl Fogel,问他是否愿意为这个新项目工作。这时 Karl 已经在和他的朋友 Jim Blandy 讨论一个新的版本控制系统的设计。他不仅已经起好了名字 “Subversion”,而且有了 Subvesion 资料库的基本设计。
      经过 14 个月的编码,在 2001 年 8 月 31 号,Subversion 可以“自我寄生”了。就是说,Subversion 开发人员停止使用 CVS 管理 Subversion 的源代码,开始使用 Subversion 代替。
      2009 年 11 月,Subversion 被 Apache Incubator 项目所接收。2010 年 1 月,正式成为 Apache 软件基金会的一个顶级项目。项目地址:https://subversion.apache.org/,我们可以从中下载源代码、文档,没有预编译的可执行程序。

    以下是几款常用的 SVN 客户端图形化软件:

    • TortoiseSVN:开源软件,在 Windows 上非常受到欢迎的一套客户端软件,它与资源管理器集成得相当不错,可以透过资源管理器在文件或目录上用鼠标右键的菜单完成 SVN 的操作。官方网站:http://tortoisesvn.net/
    • SnailSVN:Mac OS X 平台下类似 TortoiseSVN 的图形化 SVN 客户端,可自动标记文件状态,并通过右键菜单提供各种常用 SVN 功能。 网站:https://langui.net/snailsvn/
    • Ankhsvn:将 subversion 的操作集成进 Visual Studio 的 SVN 客户端软件。官方网站:http://ankhsvn.open.collab.net/
    • Subclipse:将 Subversion 的操作集成进 Eclipse 的 SVN 客户端软件。官方网站:http://subclipse.tigris.org/
    • SmartSVN:同时支持 Mac、Linux、Windows。是一款收费软件。

    BitKeeper

      BitKeeper 是一套 BitMover 公司开发的分布式版本控制软件,它曾是一款专有软件。BitKeeper 是最初的分布式源代码控制系统。BitKeeper 的许多概念取自 TeamWare(Larry McVoy 在 Sun 公司时开发的产品)。
      BitMover 公司 CEO Larry McVoy 与 Linus 曾是好友, Larry 说服 Linus 在内核开发中使用 BitKeeper。而 BitKeeper 在免费使用的许可证中加入很多限制条件,惹恼了内核开发者,最终促使 Linus 开发出了毁灭 BitMove r的 Git。

    2016 年 5 月 11 日,BitKeeper 宣布以 Apache 2.0 许可证开源。

    Mercurial

      Mercurial 是跨平台的分布式版本控制软件,主要由 Python 语言实现。Mercurial一开始的主要运行平台是 Linux,现在 Mercurial 已经移植到 Windows、Mac OS X 和大多数的类 Unix 系统中。Mercurial 主要由命令行程序组成,现在也有了图形用户界面。
      Mercurial 的创建者和主要开发人员是 Matt Mackal。其源代码采用GNU通用公共许可证第二版为授权,确保了Mercurial是一个自由软件。

    Git

      在 Linux 开源的初期,Linux 开源项目的代码是 linus 本人通过 linux 命令 diff 和 patch 两条命令手动完成。随着 Linux 代码越来越壮大,靠 Linus 一个人来手动合并已经不现实。2002 年,Linus 选择了一个商业版本控制系统 BitKeeper 作为 Linux 内核的代码管理工具(BitKeeper 的开发商 BitMover 授权 linux 社区免费使用)。但是,免费使用是有很多的限制的,因此 linux 社区的大佬开始破解 BitKeeper。其中,samba 的作者 andrew 破解成功了。但是被 BitMover 公司发现,收回免费使用权。
      迫不得已,Linus 选择了自己开发一个分布式版本控制工具以替代 BitKeeper。linus 闭关一个月,写出了 Git。在一个月后,Git 成功接管了 Linux 社区的版本控制工作,并且开始开源。维基百科中,有如下历史记录:

    • 2005 年 4 月 3 日,开始开发 Git。
    • 2005 年 4 月 6 日,项目发布。
    • 2005 年 4 月 7 日,Git 就可以作为自身的版本控制工具了。
    • 2005 年 4 月 18 日,发生第一个多分支合并。
    • 2005 年 4 月 29 日,Git 的性能就已经达到了 Linus 的预期。
    • 2005 年 6 月 16 日,Linux 核心 2.6.12 发布,那时 Git 已经在维护 Linux 核心的源代码了。

      在 2005 年 7 月 26 日,Linus 功成身退,将 Git 的维护交给另外一个 Git 的主要贡献者 Junio C Hamano。

    在 Linus Torvalds 开发出 Git 分布式版本控制系统 11 年后的 2016 年,BitKeeper 宣布在 Apache 2.0 许可证下开源。

    参考

    1. https://blog.51cto.com/12805107/2089757
    2. https://www.imooc.com/article/details/id/44217
    3. https://softwareengineering.stackexchange.com/questions/35074/im-a-subversion-geek-why-should-i-consider-or-not-consider-mercurial-or-git-or
    4. https://www.jianshu.com/p/a46f1cdada53
    5. https://gotgit.readthedocs.io/en/latest/index.html
    6. https://blog.csdn.net/qq_36647038/article/details/84022363
    7. http://www.worldhello.net/gotgit/
    展开全文
  • “Ctrl+Z”是什么操作?各位都用过,并且经常使用吧?撤销!撤销上一个操作返回上一个状态,甚至...就像Git版本控制一样,保存着每一次提交的状态,使用者可以随时reset到历史某个状态,就像一个备忘录一样,保存...

    “Ctrl+Z”是什么操作?各位都用过,并且经常使用吧?撤销!撤销上一个操作返回上一个状态,甚至撤销好几个操作,返回到几个操作之前的状态。这个操作非常有用,一旦我们某一步操作失误,可以选择撤销操作来返回原来的无错状态。

    那么系统怎么知道每一步的状态呢?它一定保存了一定数量的历史状态!就像Git版本控制一样,保存着每一次提交的状态,使用者可以随时reset到历史某个状态,就像一个备忘录一样,保存了某些阶段的状态

    1.备忘录模式简介

    类似于上述引言的例子,在软件系统的操作过程中,难免会出现一些不当的操作,使得系统状态出现某些故障。如果能够有一种机制——能够保存系统每个阶段的状态,当用户操作失误的时候,可以撤销不当的操作,回到历史某个阶段——那么软件系统将更加灵活和人性化。

    有没有这样的一种解决方案呢?有!那就是备忘录模式。备忘录模式提供了一种状态恢复的机制,用户可以方便地回到指定的某个历史状态。很多软件的撤销操作,就使用了备忘录模式。

    备忘录模式:

    在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 

    2.备忘录模式结构

    备忘录模式的UML图如下所示:

    备忘录模式主要有以下角色:

    • Originator(原发器):通过创建一个备忘录类存储当前的内部状态,也可以使用备忘录来恢复其内部状态,通常是将系统中需要保存内部状态的类设计为原发器;
    • Memento(备忘录):用于存储原发器的内部状态。备忘录的设计可以参考原发器的设计,根据需要确定备忘录类中的属性;除了原发器类对象,不允许其他对象修改备忘录
    • Caretaker(负责人):负责保存备忘录,可以存储一个或多个备忘录对象,但是负责人只负责保存对象,不能修改对象,也不必知道对象的实现细节。(看好了,负责人可以存储多个备忘录对象,想一想这有什么用?是不是可以保存多个历史状态?实现多步撤销操作了

    备忘录模式的关键是备忘录类和负责人类的设计,以下是上述三个角色的典型实现:

    #ifndef __DEMO_H__
    #define __DEMO_H__
    
    // 前向声明
    class Memento;
    
    // 原发器  典型实现
    class Originator
    {
    public:
    	Originator(){
    		state = "";
    	}
    	Originator(String iState){
    		state = iState;
    	}
    	// 创建备忘录对象
    	Memento* createMemento(){
    		return new Memento(this);
    	}
    	// 利用备忘录对象恢复原发器状态
    	void restoreMemento(Memento* m){
    		state = m->getState();
    	}
    	void setState(string iState){ 
    		state = iState; 
    	}
    	string getState(){ 
    		return state; 
    	}
    private:
    	string state;
    };
    
    // 备忘录  典型实现(仿照原生器的设计)
    class Memento
    {
    public:
    	Memento(){
    		state = "";
    	}
    	Memento(Originator* o){
    		state = o->getState();
    	}
    	void setState(String iState){
    		state = iState;
    	}
    	string getState(){
    		return state;
    	}
    private:
    	String state;
    };
    
    // 负责人  典型实现
    class Caretaker
    {
    public:
    	Caretaker(){}
    	Memento* getMemento(){
    		return memento;
    	}
    	void setMemento(Memento *m){
    		memento = m;
    	}
    private:
    	Memento* memento;
    };
    
    // 客户端 示例代码
    int main()
    {
    	// 创建原发器对象
    	Originator o = new Originator("状态1");
    	// 创建负责人对象
    	Caretaker *c = new Caretaker();
    	c->setMemento(o->createMemento());
    
    	o->setState("状态2");
    
    	// 从负责人对象中取出备忘录对象,实现撤销
    	o->restoreMemento(c->getMemento());
    
    	return 0;
    }
    
    #endif

    3.备忘录模式代码实例

    Jungle正在为代码版本管理苦恼,有时候为了尝试某个功能就去修改代码,导致原有的健壮的代码被破坏。所以Jungle希望能够设计一个代码保存和版本回退功能的demo,方便代码的管理。

    本实例中,原生器为CodeVersion,具有版本号version、提交日期date和标签label三个状态需要备忘录Memento保存;管理者是CodeManager,具有提交代码commit(即保存一个版本)、回退到指定版本switchToPointedVersion(即撤销操作)和查看提交历史codeLog的功能。该实例的UML图如下图,具体代码如下。(完整代码资源见https://github.com/FengJungle/DesignPattern

    3.1.备忘录Memento

    #ifndef __MEMENTO_H__
    #define __MEMENTO_H__
    
    class Memento
    {
    public:
    	Memento(){}
    	Memento(int iVersion, string iDate, string iLabel){
    		version = iVersion;
    		date = iDate;
    		label = iLabel;
    	}
    	void setVersion(int iVersion){
    		version = iVersion;
    	}
    	int getVersion(){
    		return version;
    	}
    	void setLabel(string iLabel){
    		label = iLabel;
    	}
    	string getLabel(){
    		return label;
    	}
    	void setDate(string iDate){
    		date = iDate;
    	}
    	string getDate(){
    		return date;
    	}
    private:
    	int version;
    	string date;
    	string label;
    };
    
    #endif

    3.2.原生器CodeVersion

    #ifndef __CODEVERSION_H__
    #define __CODEVERSION_H__
    
    #include <iostream>
    using namespace std;
    
    #include "Memento.h"
    
    // 原生器:CodeVersion
    class CodeVersion
    {
    public:
    	CodeVersion(){
    		version = 0;
    		date = "1900-01-01";
    		label = "none";
    	}
    	CodeVersion(int iVersion, string iDate, string iLabel){
    		version = iVersion;
    		date = iDate;
    		label = iLabel;
    	}
    	// 保存代码
    	Memento* save(){
    		return new Memento(this->version, this->date, this->label);
    	}
    	// 回退版本
    	void restore(Memento* memento){
    		setVersion(memento->getVersion());
    		setDate(memento->getDate());
    		setLabel(memento->getLabel());
    	}
    	void setVersion(int iVersion){
    		version = iVersion;
    	}
    	int getVersion(){
    		return version;
    	}
    	void setLabel(string iLabel){
    		label = iLabel;
    	}
    	string getLabel(){
    		return label;
    	}
    	void setDate(string iDate){
    		date = iDate;
    	}
    	string getDate(){
    		return date;
    	}
    private:
    	// 代码版本
    	int version;
    	// 代码提交日期
    	string date;
    	// 代码标签
    	string label;
    };
    
    #endif

    3.3.管理者CodeManager 

    #ifndef __CODEMANAGER_H__
    #define __CODEMANAGER_H__
    
    #include "Memento.h"
    #include <vector>
    using namespace std;
    
    // 管理者
    class CodeManager
    {
    public:
    	CodeManager(){}
    	void commit(Memento* m){
    		printf("提交:版本-%d, 日期-%s, 标签-%s\n", m->getVersion(), m->getDate().c_str(), m->getLabel().c_str());
    		mementoList.push_back(m);
    	}
    	// 切换到指定的版本,即回退到指定版本
    	Memento* switchToPointedVersion(int index){
    		mementoList.erase(mementoList.begin() + mementoList.size() - index, mementoList.end());
    		return mementoList[mementoList.size() - 1];
    	}
    	// 打印历史版本
    	void codeLog(){
    		for (int i = 0; i < mementoList.size(); i++){
    			printf("[%d]:版本-%d, 日期-%s, 标签-%s\n", i, mementoList[i]->getVersion(),
    				mementoList[i]->getDate().c_str(), mementoList[i]->getLabel().c_str());
    		}
    	}
    private:
    	vector<Memento*> mementoList;
    };
    
    #endif

    3.4.客户端代码示例及效果

    #include "Originator.h"
    #include "Memento.h"
    #include "CodeManager.h"
    
    int main()
    {
    	CodeManager *Jungle = new CodeManager();
    
    	CodeVersion* codeVer = new CodeVersion(1001, "2019-11-03", "Initial version");
    
    	// 提交初始版本
    	printf("提交初始版本:\n");
    	Jungle->commit(codeVer->save());
    
    	// 修改一个版本,增加了日志功能
    	printf("\n提交一个版本,增加了日志功能:\n");
    	codeVer->setVersion(1002);
    	codeVer->setDate("2019-11-04");
    	codeVer->setLabel("Add log funciton");
    	Jungle->commit(codeVer->save());
    
    	// 修改一个版本,增加了Qt图片浏览器
    	printf("\n提交一个版本,增加了Qt图片浏览器:\n");
    	codeVer->setVersion(1003);
    	codeVer->setDate("2019-11-05");
    	codeVer->setLabel("Add Qt Image Browser");
    	Jungle->commit(codeVer->save());
    
    	// 查看提交历史
    	printf("\n查看提交历史\n");
    	Jungle->codeLog();
    
    	// 回退到上一个版本
    	printf("\n回退到上一个版本\n");
    	codeVer->restore(Jungle->switchToPointedVersion(1));
    
    	// 查看提交历史
    	printf("\n查看提交历史\n");
    	Jungle->codeLog();
    
    	printf("\n\n");
    	system("pause");
    	return 0;
    }

    代码运行结果如下:

     这是不是像一个超级简易版本的代码版本控制系统???哈哈哈!

    4.总结

    优点:

    • 实现状态恢复、撤销操作的功能,用户可以恢复到指定的历史状态,让软件系统更加人性化;
    • 备忘录封装了信息,除了原生器以外,其他对象访问不了备忘录的代码;

    缺点:

    • 资源消耗大。如果需要保存原生器对象的多个历史状态,那么将创建多个备忘录对象;或者如果原生器对象的很多状态都需要保存,也将消耗大量存储资源。

    适用环境:

    • 保存一个对象的历史状态,系统需要设计回退或者撤销功能;
    • 备忘录类可以封装一个对象的历史状态,避免对象的历史状态被外界修改。

    欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot

    欢迎关注Jungle的微信公众号:Jungle笔记

     

    展开全文
  • 本地版本控制系统 集中化版本控制系统 分布式版本控制系统 Git 简史 Git 是什么? 版本控制简介 本文可参考 Git 官网教程 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 ...
  • 什么是集中式版本控制系统与分布式版本控制系统? 集中式版本控制系统:版本库是集中放在中央服务器的,当我们实际工作的时候,用的都是自己的电脑,所以首先要连接中央服务器,从那里得到最新的版本,然后编写或者...
  • SVN是Subversion的简称,开源的集中式管理代码的版本控制系统 2. 原理 原理是把代码都保存到一个固定的位置(仓库),每次从这个位置拷贝更新代码,进行编辑;再把修改后的代码提交到该目录中。多人协作开发也是如此...
  • 如果你连分布式版本控制系统都不知道,那说明你有点low了,自己该反思反思了(手动狗头)。这篇文章呕心沥血的带你从零开始Git之旅。 PART Ⅰ 分布式版本控制系统简介 1. 什么是分布式版本控制系统? 背景带入:...
  • Gitlab+Git实现版本控制系统

    千次阅读 2019-07-10 16:33:26
    在谷歌百度搜了大量的文章去学习,但发现自己安装时总有些坑在等着我们,经过了多次的安装卸载终于算是走了出来,在这里我给大家完整的介绍版本控制系统从搭建到使用的步骤,中间有些比较坑的地方也会着重提醒,希望...
  • 版本控制系统 “代码”作为软件研发的核心产物,在整个开发周期都在递增,不断合入新需求以及解决bug的新patch,这就需要有一款系统,能够存储、追踪文件的修改历史,记录多个版本的开发和维护。于是,版本控制...
  • 集中式版本控制系统(有 SVN、CVS等) 集中式有中央仓库(需要联着网工作) 修改的版本都在服务器仓库,每次对比代码 分布式版本控制系统(git) 分布式没有中央仓库,存在客户端一份(不用时刻连网,拉取代码时要...
  • 版本控制和版本控制系统的区别

    千次阅读 2016-08-08 20:10:57
    版本控制和版本控制系统的区别  转载必须声明转载地址http://write.blog.csdn.net/postedit 一、何谓版本控制 它是一种软件工程籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新,它透过文档控制...
  • 版本控制系统概述

    千次阅读 2016-10-29 12:53:38
    版本控制系统VCS(version control system),是一种记录若干文件变化,以便将来查阅特定版本修改记录的系统。对于编程开发人员来说,我们常使用版本控制系统来对程序源代码进行版本管理。但实际上,我们可以对任何...
  • 版本控制系统(Version Control System,以下简称VCS)就是一个用来记录文件变动历史的系统,便于之后切换回去查看你修改的历史;举个最简单的例子,我们大家写毕业论文的时候,应该不会是一次就写好了,中间会有...
  • 1小时掌握SVN版本控制系统

    千次阅读 2017-09-25 15:38:22
     SVN是现在软件开发之中的主流软件版本控制工具,在工作之中利用SVN可以有效的解决多人开发的代码管理问题,本课程将为读者讲解SVN服务器的配置以及基于MyEclipse的SVN客户端插件的配置与使用,并且在讲解之中着重...
  • Git版本控制系统之基本使用

    千次阅读 2017-08-08 16:24:34
    最早是通过接触著名的开源社区Github了解到Git的,但一直没有系统学习过。这次下定决心从头到尾系统的学一学,也将学习过程记录于此,供大家批驳。本篇文章先从以下几个方面简单了解一下Git: Git的简介以及Git与...
  • GIT(分布式版本控制系统)入门

    千次阅读 2017-12-20 22:10:22
    什么是GIT Git是目前世界上最先进的分布式版本控制系统(没有之一)。    那么问题来了,什么是分布式版本控制系统。    这里举个例子,你需要编写一个文档,这个文档呢财务部需要,产品部也需要。那么你要...
  • 管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取,对开发小组中对源代码的访问进行有效的协调VSS作为一款历史悠久的版本管理工具,在早期扛起了版本管理系统方面的大气,能...
  • 闲话不多说,直接奔主题,说道版本控制系统,无非就是SVN和Git,SVN更适应于项目管理,毕竟一个团队有各种成员,能够按目录进行分类管理,简直是好处大大滴!但是今天小白我还是学学Git吧,git更适用于代码管理,so ...
  • 1. 几个基本概念 SCM:软件配置管理,用来追踪和控制软件的变化的任务。 SCI:软件配置项,软件中发生变化的基本单元(例如:文件)。 Baseline:基线,软件持续变化过程中的“稳定时刻”(例如:对外发布的版本...
  • 1)Git是分布式的,SVN不是:这 是git和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在...

空空如也

1 2 3 4 5 ... 20
收藏数 34,588
精华内容 13,835
关键字:

版本控制系统