03.06 如Git、SVN这类版本控制工具的原理是什么,以及如何操作?

Figo笔记


Git 和svn的最大区别以及Git原理介绍

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

一、Git 与 SVN 区别

GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。

Git 与 SVN 区别点:

1、GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。

2、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。

3、GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。

4、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。

5、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

二、Git原理:Git 工作区、暂存区和版本库

基本概念

我们先来理解下Git 工作区、暂存区和版本库概念

工作区:就是你在电脑里能看到的目录。

暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

三、Git常用操作指南

使用Git前,需要先建立一个仓库(repository)。您可以使用一个已经存在的目录作为Git仓库或创建一个空目录。

使用您当前目录作为Git仓库,我们只需使它初始化。

git init

使用我们指定目录作为Git仓库。

git init newrepo

从现在开始,我们将假设您在Git仓库根目录下,除非另有说明。

添加新文件

我们有一个仓库,但什么也没有,可以使用add命令添加文件。

git add filename

可以使用add... 继续添加任务文件。

提交版本

现在我们已经添加了这些文件,我们希望它们能够真正被保存在Git仓库。

为此,我们将它们提交到仓库。

git commit -m "Adding files"

如果您不使用-m,会出现编辑器来让你写自己的注释信息。

当我们修改了很多文件,而不想每一个都add,想commit自动来提交本地修改,我们可以使用-a标识。

git commit -a -m "Changed some files"

git commit 命令的-a选项可将所有被修改或者已删除的且已经被git管理的文档提交到仓库中。

千万注意,-a不会造成新文件被提交,只能修改。

发布版本

我们先从服务器克隆一个库并上传。

git clone ssh://example.com/~/www/project.git

现在我们修改之后可以进行推送到服务器。

git push ssh://example.com/~/www/project.git

取回更新

如果您已经按上面的进行push,下面命令表示,当前分支自动与唯一一个追踪分支进行合并。

git pull

从非默认位置更新到指定的url。

git pull http://git.example.com/project.git

删除

如何你想从资源库中删除文件,我们使用rm。

git rm file

分支与合并

分支在本地完成,速度快。要创建一个新的分支,我们使用branch命令。

git branch test

branch命令不会将我们带入分支,只是创建一个新分支。所以我们使用checkout命令来更改分支。

git checkout test

第一个分支,或主分支,被称为"master"。

git checkout master

对其他分支的更改不会反映在主分支上。如果想将更改提交到主分支,则需切换回master分支,然后使用合并。

git checkout mastergit merge test

如果您想删除分支,我们使用-d标识。

git branch -d test


尘风沐雨


Git是Linus之父 Torvalds 为了管理 Linux 内核代码设计而开发的一个开源的版本控制系统。



Linux核心的开发迭代是由众多分散的程序员完成。当时大家常用的代码管理工具BitKeeper,因为不开源,引起我们的linux大佬强烈的不满,但又赞许BitKeeper的优于其他工具的分布式架构,索性Torvalds自己开发了代码管理工具,就是GIT。听说从无到实战部署只花了10天时间。



而GIT与Svn最核心的区别就是GIT是分布式架构平台。而相对于Svn只是一个单纯的文件版本管理系统而言,GIT更是一个内容管理平台,版本控制甚至只是一个次属功能。

我们了解GIT的结构就大致知道其工作原理。git分3个数据存储区:

工作区:存放项目文件。

暂存区:临时存放的改动数据,即将提交到仓库。

git仓库:最后存放文件版本的仓库。

工作原理及主要操作命令:

对工作区修改(或新增)- git add 。暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到一个新对象,而该对象的ID被记录在暂存区的文件索引中。

执行提交操作 - git commit。暂存区的目录树写到版本库中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

重置暂存区 - git reset HEAD。暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

删除暂存区 - git rm --cached 。会直接从暂存区删除文件,工作区则不做出改变。

暂存区文件覆盖工作区 - git checkout 。会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

版本master分支文件覆盖暂存区和工作区 - git checkout HEAD ,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令极具危险性:因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。



至于svn,目前我用的极少,操作比git 简单,两者区别:

  1. GIT是分布式的,SVN只有一个中央版本库。
  2. GIT把内容按元数据方式存储,而SVN是按文件方式。
  3. Git下载下来后,在OffLine状态下可以看到所有的Log,SVN不可以。
  4. GIT没有一个全局的版本号,而SVN有,此点是svn的优点。
  5. SVN只能有一个指定中央版本库。当这个中央版本库有问题时,所有工作成员会沿袭错误。而 Git可以有无限个版本库。
  6. GIT的内容完整性要优于SVN。GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

iFrees


还不如实际去用用


分享到:


相關文章: