分享

如何理解Git的分布式?

 昵称11935121 2018-04-14

分布式工作流程

同传统的集中式版本控制系统(CVCS)不同,开发者之间的协作方式因着 Git 的分布式特性而变得更为灵活多样。在集中式系统上,每个开发者就像是连接在集线器上的节点,彼此的工作方式大体相像。而在 Git 网络中,每个开发者同时扮演着节点和集线器的角色,这就是说,每一个开发者都可以将自己的代码贡献到另外一个开发者的仓库中,或者建立自己的公共仓库,让 其他开发者基于自己的工作开始,为自己的仓库贡献代码。于是,Git 的分布式协作便可以衍生出种种不同的工作流程,我会在接下来的章节介绍几种常见的应用方式,并分别讨论各自的优缺点。你可以选择其中的一种,或者结合起 来,应用到你自己的项目中。

特别是,当作为项目贡献者时,我们该怎么做才能方便维护者采纳更新;或者作为项目维护者时,又该怎样有效管理大量贡献者的提交。

如果双方改的是不同的文件,或者同一个文件的不同部分,那么 git 是可以自动合并的。如果修改的是同一个文件同一个部分,git 就没办法自动合并了,这种情况被称为「冲突」,git 会列出双方的最新版本,然后由进行合并的人(例子里是 C), 手动进行编辑。在实际开发中,如果两个人只是往这个文件里加函数,是完全可以自动合并的,冲突主要是出现了修改了同一行的情况。

很多介绍强调 git 可以离线 commit, 意在于和 svn 做对比。svn 中,只有服务器上有完整的版本库,客户端的代码历史并不是完整的。而 git 中每一个客户端都是一个完整的版本库,push 和 pull 操作其实是在多个完整的版本库之间做同步。

这样的优势就是不怕服务器挂掉或者丢失,每个人都有完整的版本库,这也是 Linus 开发 git 的出发点(Linux 是一个多人分布式协作的开源项目). 而劣势就在于权限管理比较差,每个人都有完整的版本库有可能会导致代码(历史上所有的修改)不小心泄露。


本地提交

本地提交好处主要有3点:1) 断网提交2) 小步提交。可以对自己的阶段成果有跟踪,并且提高每次变更的安全性3) 本地库。这个和断网提交是同一个实现,但从需求角度出发则略有不同,主要是说即使只有自己一个人开发项目,也可以轻易的让自己的代码有版本跟踪,而不需要去费力建个什么svn server4) 本地回滚。这个其实是由于本地库的存在而产生的,但可以减少中央库上的冗余版本

分支策略支策略从技术上来讲是将版本节点化了,即最终的版本状态是树状的。从结果上来讲既是弱化了分支,也是强化了分支。弱化的是分支的概念,强化的是分支的功能。

在Git实际开发中分支的分离和merge是属于日常操作,开启和合并分支成本相比SVN要小得多:SVN是复制一份代码到分支目录,Git则是在分支点做一下标记。

随便一次冲突就会自动产生分支,所以大家每天都在与分支打交道。这便是弱化了分支的概念,由于分支成本很小,因此使得按功能分支的开发模式(每个分支一个功能,开发完了再merge到主干)变得非常简单,大家可以完全不需要再因为担心SCM成本太高而选用主干开发模式(所有功能都在主干上开发,到了发版本前再分离出分支)。

当然Git还有很多其他不错的地方,比如Tag策略(和分支策略一样,做个标记,不像SVN要复制一份过去),下载时会压缩以加快速度,各类提示非常到位




git分布式的理解----简单服务端搭建

  Git是分布式的,并没有服务端跟客户端之分,所谓的服务端安装的其实也是git。Git支持四种协议,file,ssh,git,http。ssh是使用较多的,下面使用ssh搭建一个免密码登录的服务端。

  1、提前安装git跟sshserver;

  2、 创建一个用户,用来运行git服务;

  新建一个用户,叫gituser,然后切换到gituser的默认目录,创建一个叫.ssh的文件夹,并在其中创建一个叫authorized_keys的文件,这个文件将用于存储git开发者的ssh公钥。

  

  3、建立一个git仓库;

  切换到gituser默认目录,建立一个testgit文件夹,在其中创建一个用于测试的git项目并进行初始化。

  

  创建一个aaa.txt,内容随便填写,将该文件纳入git管理

  

  4、创建证书

  切换到git开发者电脑。设置本地git用户并创建公钥和私钥

  

  Windows系统,在用户主目录下有id_rsa.pub跟id_rsa两个文件:

  

  

  这两个就是一对秘钥,id_rsa是私钥,id_rsa.pub是公钥。

  5、添加公钥到ssh  

  将本地生成的id_rsa.pub的内容追加到git服务器gituser用户的~/.ssh/authorized_keys文件中。注意,不是把authorized_keys建成文件夹,把公钥扔进去,是追加文件内容。

  特别要注意:.ssh的权限必须是700,authorized_keys文件的权限必须是600,否则公钥无法生效。

  6、修改ssh服务端配置

  vi /etc/ssh/sshd_config

  

  7、从服务端clone项目

  在开发者电脑端,执行以下命令:

  

  可以看到我们成功把“服务器”上的git项目clone到了本地。

  ------------------------------------------------------------------------------------------------------------

  其实,上面的操作有些繁琐:在“服务端”建一个git项目,然后初始化,然后建一个可以免密码登录的用户,然后用这个账号把git项目拷贝了下来;简单来说,我不免密码登录,也可以git clone那个项目,比如我用root用户:

  

  也就是说,只要“服务端”有git项目,有一个可以远程登录的ssh用户,我们就可以直接git clone 那个项目,这个时候,“服务端”跟“客户端”都只要git,没有所谓的gitlab等服务端软件,两者之间只是通过ssh通信就可以实现git的clone,commit等操作,两者地位是平等的。

  可见git的确是无中心的分布式的。而github,gitlab之类的“服务端”其实是一个帮助我们管理用户跟git通信方式的工具,在这一点上,gitlab跟visualsvn-server之类的软件有本质的区别。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多