版本控制系统版本控制系统是帮助软件开发人员实现团队协作和历史版本维护的软件。一个版本控制系统应该具备以下基本功能:允许开发人员并发工作;不允许一个开发人员覆盖另一个开发人员的更改;保留所有版本历史记录。版本控制系统可分为以下两类:集中式版本控制系统;分散(分布式)版本控制系统。Git是一个分布式版本控制系统。在本章中,我们将重点关注分布式版本控制系统,尤其是Git。分布式版本控制系统集中式版本控制系统使用一个中央服务器存储所有文档,并在这个中央服务器上实现团队协作。这个系统的主要缺点是中央服务器可能会出现单点故障:如果中央服务器不幸宕机了一个小时,那么在这个小时内,将根本无法进行协同开发。这个缺点可能导致的最坏情况是,如果中央服务器在备份成功之前完全崩溃,则存储在中央服务器上的项目的所有历史版本都将丢失。此时,是时候考虑分布式版本控制系统了。分布式版本控制系统中的客户端不仅可以查看项目目录的最新快照,还可以镜像整个存储库。如果服务器宕机,客户端存储的任意仓库镜像都可以作为备份进行恢复。每次签出都会形成存储库的完整备份。Git不依赖于中央服务器,因此开发人员可以离线执行各种操作。开发者可以离线提交、创建分支、查看日志等,只需要在想要发布自己的修改或者获取最新修改的版本时连接网络即可。Git的优势免费和开源Git是在GPL开源许可证下发布的,可在整个Internet上免费获得。不用花一分钱就可以用Git来管理物业相关的项目,而且因为它是开源的,你也可以下载源码,根据自己的需要进行修改。快速轻便,因为大部分操作都可以在本地完成,大大提高了速度。Git不依赖中央服务器,这就是为什么每个操作都不需要与远程服务器交互的原因。Git的核心部分是用C语言编写的,避免了使用高级语言造成的运行时浪费。虽然Git镜像了整个存储库,但客户端的数据量仍然很小,这很好地说明了Git如何高效地存储客户端压缩的数据。默认备份当镜像副本很多时,数据丢失的可能性大大降低。任何客户端上的数据都是仓库的镜像,当系统崩溃或硬盘损坏时,这些数据可以用来恢复。SecureGit使用一种称为安全散列算法(SHA1)的加密方法来命名和识别数据库中的对象。每个文件、每次提交都会添加一个校验码进行校验,每次取出数据都必须使用校验码进行校验。这意味着,如果不了解Git,开发人员就不可能成功地修改文件数据、提交消息或以其他方式更改Git项目数据库。硬件资源要求不高。当使用集中式版本控制系统时,所需的中央服务器必须足够强大以支持所有团队成员的请求。对于小型开发团队来说,这个问题不难解决,但如果团队规模持续增长,服务器的硬件限制就会成为瓶颈。在分布式版本控制系统中,开发者只需要在推送(push)或拉取(pull)变更时连接到服务器,所有繁重的工作都在客户端完成,因此服务器的硬件条件可以简单规划.更简单的分支管理集中式版本控制系统采用简单的复制机制,如果我们在其中创建一个分支,那么该分支会将项目的所有代码复制到新的分支中,这种方式效率不高且耗时,而且删除和合并集中式版本控制系统中的分支是复杂且耗时的。但是在Git中管理分支要容易得多,在Git中创建、删除和合并分支只需要很少的时间。分布式存储系统中的术语LocalRepository所有的版本控制系统工具都提供了一个个人工作空间,复制的工程项目在其中运行,开发人员在个人工作空间中进行更改,然后提交。这些更改成为项目存储库的一部分。Git更进一步,为开发人员提供了整个仓库的私有副本。开发者可以对这个仓库进行任何操作,如添加文件、删除文件、移动文件、提交变更等。工作目录和暂存区或索引(WorkingDirectoryandStagingAreaorIndex)工作目录是文档被拉取或创建的目录位置。在集中式系统中,开发人员通常进行更改并将更改直接提交到存储库。吉特是不同的。Git不会跟踪每次修改的每个文档。每当您提交操作时,Git都会在暂存区中搜索现有文档。不会考虑所有修改过的文档,而只会考虑临时存储区域Documentation中的现有文档。让我们看一下Git的基本工作流程:第一步——修改工作目录下的一个文档;第二步——将此文件添加到暂存区;存储区将文档移动到本地仓库中,推送操作完成后,变更永久保存在Git仓库中。如果你修改了sort.c和search.c这两个文件,你想对这两个修改进行两次提交,这时候你可以在提交前在暂存区添加一个文件,然后按这个方式处理下一个文件。操作示例如下,-m后的参数为本次提交的说明:#Firstcommit[jerry@CentOS~]$gitaddsort.c#addsfiletothestagingarea[jerry@CentOS~]$gitcommit–m“添加排序操作”#第二次提交[jerry@CentOS~]$gitaddsearch.c#添加文件到暂存区[jerry@CentOS~]$gitcommit–m“添加搜索操作”BinaryLargeObjects(Blobs)Blob是BinaryLargeObject(二进制大对象)的缩写,文件的每个版本都表示为一个blob类型。Blob包含文件的所有数据,但不包含文件的元数据。这是一种二进制文件,在Git数据库中被称为“文件的安全散列”。在Git中,文件不是按名称寻址,而是按内容寻址。树是代表目录的对象。它包含blob类型的文件和其他子目录,树是一种二进制文件,用于存储blob的索引或称为树对象的安全哈希。提交操作(Commits)提交操作维护仓库的当前状态,并且一次提交也由安全散列命名。你可以把提交操作对象看成链表的一个节点,每个提交操作对象都有一个指向父提交节点的指针。从给定的提交中,您可以通过查找父指针来回顾提交的历史记录。如果一个提交有多个父级,则该提交是通过合并两个分支创建的。分支分支用于创建另一条开发路径。默认情况下,Git有一个master分支,就像另一个版本管理工具Subversion一样,是SVN中的trunk主干。一般来说,一个分支用于一个新功能的开发。一旦开发出新的功能,分支就合并到master,然后删除分支。每个分支都可以用HEAD来指示,如果没有指定,它总是指向该分支的最新提交状态。每当您进行提交时,HEAD都会使用最新的提交更新自身。标签(Tags)标签可以为仓库中的特定版本分配有意义的名称。标签类似于分支,只是标签不会改变。这意味着标签是一种没有人修改的分支。为特定提交创建标签后,即使您进行新提交也不会更新它。通常,开发人员会为产品的发布版本创建标签。克隆克隆操作将创建仓库的一个实例。克隆不仅可以查看当前工作的副本,还可以镜像整个版本库。用户可以在本地仓库完成各种操作,只需要在仓库实例同步时连接网络即可。拉取(Pull)拉取操作将远程仓库实例的变化复制到本地,这个操作用于两个仓库实例的同步。拉取操作与SVN中的更新操作效果相同。推送(Push)推送操作将本地仓库实例中的更改复制到远程仓库。该操作常用于将本地的改动永久保存在Git仓库中。push操作与SVN中的commit操作效果相同。HEADHEAD是一个指针,它始终指向分支中的最新提交。每当您进行提交时,HEAD总是会更新为最新的提交。分支头存储在.git/refs/heads/目录中。[jerry@CentOS~]$ls-1.git/refs/heads/master[jerry@CentOS~]$cat.git/refs/heads/master570837e7d58fa4bccd86cb575d884502188b0c49修订版(Revision)是对源代码的修改,修改在Git中由提交表示,这些提交操作由安全的哈希算法标识。URLURL表示Git仓库的位置,存放在Git配置文件.git\config中。[gituser@CentOS~]$cat.git/config[core]repositoryformatversion=0filemode=truebare=falselogallrefupdates=true[remote"origin"]url=gituser@git.server.com:project.gitfetch=+refs/heads/*:refs/remotes/origin/*我已经将Git系统文章整理成电子书,请点击下方链接免费获取:链接:https://pan.baidu.com/s/1mM6j...提取码:1234最后,最近有很多朋友找我要Linux学习路线图,于是结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以加入我的行列,把这本电子书做得更加完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员进阶架构师必备资源免费书单|程序员必读经典书籍清单(高清PDF版))
