简介

在过去几年,对于分布式版本控制可以给开发过程提供的益处有许多争论。最近,分布式工具已经很成熟了。尽管分布式工具的一些优点最初可能不明显,但是从长期来看,它们提供的灵活性是非常有意义的。阅读完本文之后,您应该能够开始使用分布式版本控制系统,基本了解分布式模型能够提供的优点。

围绕分布式版本控制的争论主要集中在不再需要的中心服务器。这是一个非常独特的特性,对于一些开发人员组很重要,但是它的真正价值在于,它允许开发人员组实现他们选择的几乎任何工作流。它能够完成很多事情,比如传统的集中式模型,或两个开发人员在咖啡馆通过无线连接协同工作,等等。

允许开发人员以各种新的方式工作,这是分布式版本控制真正令人兴奋的特点。实际上,在本文末尾会介绍如何实现这样的“咖啡馆”工作流。这对于作家、学校教师和 Linux® 内核开发人员都有益处。

什么是分布式版本控制?

分布式版本控制 (DVCS) 是一种不需要中心服务器的管理文件版本的方法,但是它也可以使用中心服务器。更改可以被合并到 DVCS 的任何其他用户的系统中,因此可以实现非常灵活的工作流。

DVCS 的两个主要优点是:它比集中的版本控制更灵活,因为它除了支持传统的(集中式)工作流,还支持其他各种工作流;它比集中式服务器快得多,因为大多数操作在客户机本地进行,而不需要网络操作。

什么是钩子?

钩子是在版本控制操作的生命周期中通过程序执行操作的方法。例如,通过使用钩子,可以在代码签入(check in)存储库时自动发送电子邮件。另外,还可以在签入代码之前,检查用户是否满足一组条件,比如包含一个测试文件。

另一种扩展版本控制系统功能的方法是编写插件。如果打算编写自己的插件,在 参考资料 中可以找到描述 Bazaar、Git 和 Mercurial 的插件系统的文章链接。

DVCS 和集中式版本控制系统的主要差异

在 DVCS 和集中式版本控制系统之间有三个关键差异。第一个差异是,DVCS 通过本地提交支持离线工作,这是由 DVCS 的操作方式决定的。这与集中式版本控制完全不同,集中式版本控制要求通过到中心服务器的连接执行所有操作。这种灵活性让开发人员在飞机上也能够像在办公室中一样轻松地工作,可以一次又一次地进行提交。

第二个差异是 DVCS 比集中式系统更灵活,因为 DVCS 支持许多不同类型的工作流,从传统的集中式工作流到纯粹的特殊工作流,再到特殊工作流和集中式工作流的组合。这种灵活性允许通过电子邮件、对等网络和开发团队喜欢的任何方式进行开发。

第三个差异是 DVCS 比集中式版本控制系统快得多,因为大多数操作在客户机上进行,速度非常快。另外,在需要进行推(push )操作(与另一个节点通信)时,速度也更快,因为两个客户机机器上都有完整的元数据。速度差异相当显著,根据使用本地存储库还是网络存储库,DVCS 比 Subversion 快大约 3-10 倍。

回页首

分布式版本控制工作流

因为 DVCS 非常灵活,可以实现各种各样的工作流,但是由于篇幅有限,本文只讨论两种工作流。首先讨论最常用的工作流之一 Partner 工作流。按照 Partner 工作流,一个开发人员启动一个项目,然后进行分支。然后,在不同开发人员工作的分支之间来回合并更改。

第二种常用的工作流是通过本地提交使用集中式服务器。在这种工作流中,开发人员的工作方式与使用集中式 subversion 存储库时非常相似,但是他们进行本地提交,然后把最终更改推到集中式服务器。这种工作流有许多变体,包括与 Partner 工作流结合使用。重要的是,可以采用许多种工作方式,通过使用 DVCS,可以灵活地选择最适合自己的工作方式。

回页首

快速入门指南

了解一种新技术的最好方法之一是实际使用它。在本节中,简要介绍 Mercurial、Bazaar 和 Git 中的常用操作,您可以试试这些操作:

  • Mercurial

    • 安装:sudo easy_install-2.5 mercurial
    • 建立项目目录:mkdir hgrepo; cd hgrepo
    • 初始化项目:hg init
    • 添加文件:touch foo.txt; hg add foo.txt
    • 提交:hg commit -m "added foo.txt" commit
    • 抓取共享的存储库:hg clone ssh://example.com//projects/hgrepo
    • 本地提交更改:hg -ci -m "adding a change"
    • 把更改推到服务器:hg push
    • 以补丁形式查看未处理的更新:hg incoming -p
    • 从服务器下载更新:hg pull
    • 应用更改:hg update
    • 合并冲突:hg merge
    • 合并两个不相关的远程存储库:hg pull -f ssh://example2.com//projects/hgrepo
  • Bazaar
    • 安装:sudo easy_install-2.5 bzr
    • 建立项目目录:mkdir bzrrepo; cd bzrrepo
    • 初始化项目:bzr init
    • 添加文件:touch foo.txt; bzr add foo.txt
    • 提交:bzr commit -m "added foo.txt" commit
    • 抓取共享的存储库:bzr branch bzr+ssh://example.com/projects/gitrepo
    • 本地提交更改:bzr -ci -m "adding a change"
    • 把更改推到服务器:bzr push
    • 从服务器下载更新:bzr pull
    • 应用更改:bzr update
    • 合并冲突:bzr merge
  • Git
    • 安装:下载最新的 tar 文件 http://kernel.org/pub/software/scm/
    • 建立项目目录:mkdir gitrepo; cd gitrepo
    • 初始化项目:git init
    • 添加文件:touch foo.txt; git add foo.txt
    • 提交:git commit -m "added foo.txt" commit
    • 抓取共享的存储库:git clone ssh://example.com/projects/bzrrepo
    • 本地提交更改:bzr -ci -m "adding a change" commit
    • 把更改推到服务器:bzr push
    • 从服务器下载更新:bzr pull
    • 应用更改:bzr update
    • 合并冲突:bzr merge

回页首

转换工具和与 subversion 的集成

这三种 DVCS 都能够把现有的 subversion 存储库轻松地转换为各自的格式,甚至可以在不同的 DVCS 之间进行转换。这使开发人员能够方便地试用 DVCS 或从一种 DVCS 转移到另一种 DVCS。

例如,对于 Mercurial,可以使用工具 hgimportsvn 和 hgpullsvn 与现有的 subversion 存储库通信,创建新的 hg 存储库和历史。tailor 工具是一种通用的存储库转换工具。

另一种有意思的试用方法是集成 DVCS 与现有的 subversion 存储库。对这种方法的详细讨论超出了本文的范围,但是 参考资料 给出了一些工具的链接,这些工具可以在 subversion 分支与 Git、Bazaar 和 Mercurial 之间进行双向操作。

回页首

第三方托管选项

如果开放源码或商业开发人员不希望或不需要管理自己的集中式 “集线器”,那么可以选用流行的托管站点托管自己的 Git、Bazaar 或 Mercurial 项目。对于 Mercurial,流行的免费和付费托管站点是 Bitbucket。对于 Git,可以使用 Github;对于 Bazaar,可以使用由 Canonical 发起的 Launchpad。

回页首

提示:“咖啡馆” Mercurial 工作流

图 1. 咖啡馆工作流

如果希望实现安全的特殊版本控制工作流,让两个开发人员可以在咖啡馆中通过无线网络一起工作,那么可以试试下面的方法。

第一个用户使用 Mercurial 创建一个存储库:

mkdir /tmp/myhgrepo
cd /tmp/myhgrepo
hg init

然后,通过 Web 作为只读共享共享它:

hg serve

第二个用户使用以下命令克隆这个存储库:

hg clone http://example.com:8000

注意:这是另一台机器的 IP 地址或本地主机名。在 OS X 上,可以通过对 your-machine-name.local 使用 Bonjour 获得这一信息。

第二个用户进行他需要的更改,然后作为只读的 HTTP 共享提供他的存储库:

http://example.com:8000

第一个用户对第二个用户的存储库拷贝执行 hg 拖操作:

hg clone http://example2.com:8000

每个开发人员都是安全的,因为他们只在需要更新自己的本地文件系统时才对对方的存储库进行拖操作。

回页首

结束语

本文讨论了分布式版本控制能够提供的价值,比较了三种主流工具 Git、Mercurial 和 Bazaar 之间的差异。如果您不太熟悉版本控制,那么应该继续学习版本控制、钩子和插件以及它们能够提供的功能。

如果您是老手,那么应该试试这些工具,寻找最适合自己的工具。请通过 参考资料 中的链接详细了解各种分布式版本控制系统以及别人的使用经验。

转载于:https://www.cnblogs.com/ryanlaw/archive/2011/10/11/2207967.html

分布式版本控制系统入门相关推荐

  1. GIT(分布式版本控制系统)入门

    什么是GIT Git是目前世界上最先进的分布式版本控制系统(没有之一). 那么问题来了,什么是分布式版本控制系统. 这里举个例子,你需要编写一个文档,这个文档呢财务部需要,产品部也需要.那么你要怎么写 ...

  2. Git 入门——分布式版本控制系统

    一.Git简介 1.什么是git git是一个开源的分布式版本控制系统,用于高效敏捷的管理大小项目代码. 2.集中式与分布式 二.安装 Git 1.Linux 上安装Git sudo apt-get ...

  3. 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境(服务器端及客户端)(转)...

    近期想改公司内部的源码管控从TFS为git,发现yubinfeng大侠有关git的超详细大作,现将其转载并记录下,以防忘记,其原博客中有更加详细的git及.net开发相关内容.原文地址:http:// ...

  4. Git分布式版本控制系统(上)

    Git分布式版本控制系统(上) 链接:https://pan.baidu.com/s/1CgaEv12cwfbs5RxcNpxdAg 提取码:fytm 复制这段内容后打开百度网盘手机App,操作更方便 ...

  5. Git分布式版本控制系统

    Git分布式版本控制系统 git remote -v 查看仓库 一 企业高效持续集成平台场景介绍: 二,GIT分布式版本控制系统: 2.1 Git简介: 2.1.1 git是什么? Git在Wikip ...

  6. 分布式版本控制系统 Git 教程

    简介 Git 是什么? Git 是一个开源的分布式版本控制系统. 什么是版本控制? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 什么是分布式版本控制系统? 介绍分布 ...

  7. 使用Git分布式版本控制系统

    GIT(分布式版本控制系统) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理 ...

  8. Git 分布式版本控制系统

    目录 文章目录 目录 Git 分布式版本控制系统 Git 的基本概念 Git 的仓库结构 Git 的核心对象 Git 的数据结构 Git Flow 参考文档 Git 分布式版本控制系统 Git 是一个 ...

  9. 分布式版本控制系统Git学习资源收集汇总

    伴随着知乎上一个问题:GitHub 是怎么火起来的?被顶起200+的回答说到:Github不是突然火起来的,在Ruby社区Github其实从一开始就很流行,我们2009年搞Ruby大会就邀请了Gith ...

最新文章

  1. Ocelot(二)- 请求聚合与负载均衡
  2. pytorch focalloss多分类 单分类
  3. 使用宝塔面板部署tp5网站
  4. android世界时钟代码大全,世界时钟精美时钟代码
  5. s5-1 网络层引言
  6. github注册之后更新教程
  7. 太难了!用Python数据造假后,我被公司升职加薪了~
  8. [Android]使用Dagger 2依赖注入 - 自定义Scope(翻译)
  9. mysql ansi导入_mysql导入csv的4种报错的解决方法
  10. linux进程属性,linux进程属性
  11. scratch编程作品展示
  12. 使用wireshark进行安卓抓包分析
  13. C语言关键字浅析-_Complex
  14. 什么是web安全测试
  15. 政务云迁移服务项目预算制定
  16. 双十一哪款蓝牙耳机值得入手?音质超棒的蓝牙耳机推荐
  17. edge扩展下载失败解决办法
  18. 什么是java线程_Java多线程是什么意思?
  19. OAuth2之授权服务
  20. [转]90后准程序员写给前辈们的一封…

热门文章

  1. 在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...
  2. 判断一个字符串大写小写,和数字出现的次数
  3. 在数学中10!代表10的阶乘。既代表1*2*3*4....*10; * 现在要求编程求出8!。
  4. 数据结构作业1 讲解和拓展
  5. 二分查找及一般拓展总结
  6. Github(2)-本地配置git
  7. C++primer 第 4 章 表达式 4.1基础 4 . 2 算术运算符 4 .3 逻辑和关系运算符 4 . 4 赋值运算符 4 .5 递增和递减运算符 4.6成员访问运算符
  8. C++中lock_guard的学习
  9. 计算机系统基础 数据的表示和存储
  10. 什么是真正的高清,你知道吗?