为什么用GitGit是LinusTorvalds开发的一款开源版本控制软件,用于帮助管理Linux内核开发。大神就是大神。Git是Linux发展之后的又一杰作。这是唯一的原因吗?Git在软件开发中的地位——配置管理SCM软件配置管理(SCM,或简单的CM)是一个组织框架——即一门学科——用于管理计算机系统在系统开发的所有阶段的演变。软件配置管理:通过实施版本控制、变更控制程序和使用适当的配置管理软件,确保所有配置资源的完整性和可追溯性。配置管理是工作成果的有效保障。没有软件配置管理,最大的麻烦就是工作结果无法追溯。配置管理的内容和目标配置管理的内容:一类是产品的一个组件,如需求文档、设计文档、源代码、测试用例等;另一类是管理过程中产生的文件,如各种软件配置管理,用于规划、报告等,是为了在整个软件生命周期中建立和维护项目产品的完整性。其基本目标包括:1.软件配置管理的各项任务有计划地进行。2.选定的项目产品被识别、控制并可供相关人员访问。3.控制已识别项目产品的变更。4.让相关团体和个人了解软件基准的状态和内容。配置管理的主要任务软件配置管理的主要任务概括如下:(1)制定项目的配置计划;(2)识别配置项;(3)对配置项进行版本控制;(4)对配置项进行变更控制;(5)定期进行配置审计;(6)向相关人员报告配置情况。版本控制版本控制是软件配置管理的核心功能。位于配置资源库中的所有元素应自动进行版本识别,并保证版本命名的唯一性。在生成过程中,版本会根据设定的使用模型自动分支演进。版本控制(Revisioncontrol)确保不同人编辑的同一个文件得到更新。版本控制中的基本概念1)签入、提交、签出2)冲突、解决、合并3)分支、版本4)锁定、挂钩.1、VSS:visualsourcesafe,微软的东西,1997年写VC程序的时候用过,人多的时候性能差,不知道现在升级版怎么样2、Clearcase:在Unix上开发的分布式应用1999时常使用,功能强大。它不仅限于版本控制。它仅供有钱的大型团队使用。4、SVN:曾经的宠儿,在工作的合资公司使用、权限管理、分支合并等方面做的很好,在多家公司推广使用。还记得TortoiseSVN吗?那只可爱的小乌龟。5.perforce:是一款商业软件,具有轻便、快速的SCM工具和真正的客户/服务器系统的特点。高通内部使用的版本管理工具。真的很好。6.git:现在***...比较cvs、svn和git:Git简介GIT是一个免费、开源、分布式的版本控制系统。每个GIT克隆都是一个完整的存储库,具有完整的历史记录和修订跟踪。它最大的特点是“分支”和“合并”操作快速简便。支持离线工作,GIT是整个项目范围的原子提交,GIT中的每个工作树都包含一个包含完整项目历史的存储库。核心特点:Git底层自维护存储文件系统:存储文件快照,即整个文件内容,并保存指向快照的索引。分散分布式控制优缺点:优点:适合分布式开发,强调个体。公服压力和数据量不会太大,速度快灵活。任何两个开发人员之间的冲突都可以轻松解决。离线办公。缺点:学习周期比较长。不符合常规思维。代码保密性差。一旦开发者克隆了整个库,所有的代码和版本信息都可以完全公开。Git原理Git的目录结构,无论是通过gitinit还是克隆的git仓库,目录结构如下:主要目录结构说明如下表所示:所有分支指针都存放在.git/refs/heads目录,HEAD在.在git/HEAD目录中,标签在.git/refs/tags目录中。快照示例:一个工程中有两个文件A和B,有3个版本:V1.0A和B,V1.***1和B,V2.0A1和B1实际存储在实际存储中Git3个快照4个文件。Git对文件进行SHA-1计算作为文件的唯一ID,检查文件的完整性。SHA-1算法计算文件内容生成一个40位的Hash值。SHA-1算法的特点:由文件内容计算出的Hash值;相同的哈希值,相同的文件内容。文件夹是使用SHA-1的前两位创建的,其余38位是文件名。这些Obj文件其实分为四种,分别是Blob、Tree、Commit、Tag。Blob用于存储项目文件的内容,但不包括文件的路径、名称和格式等其他描述性信息。项目中任何文件的任何版本都存储为blob。TreeTree用于表示目录。我们知道,项目就是一个目录,里面有文件和子目录。因此,Tree中有Blob和子Trees,它们都是通过SHA-1值引用的。这对应于目录。从顶层Tree看整个树结构,叶子节点是Blob,代表文件的内容,非叶子节点代表项目的目录。顶级Tree对象表示当前项目的快照。Commit代表一个提交,有一个Parent字段来引用父提交。指向一个顶层的Tree,它代表了项目的一个快照,以及一些其他的信息,比如最后的提交者、作者、消息等。Git中有4种类型的仓库:远程仓库、工作区、本地仓库,和缓存。暂存区的好处:为了能够实现部分提交,为了不在工作区创建状态文件,污染工作区。暂存区记录文件的修改时间等信息,以提高文件比较的效率。暂存区是用于构建项目快照的区域。暂存区是一个文件,路径为:.git/index是一个二进制文件,第四列是文件名,第三列是文件的冲突状态,第二列是文件的blob.Commit命令将暂存区***的内容保存到本地仓库。提交时,Git会利用暂存区中的信息生成一个Tree对象,即项目的快照,最后保存到数据库中。文件的状态可以分为两类。一种是暂存区与本地仓库比较得到的状态,另一种是工作区与暂存区比较得到的状态。之所以分为两个类也很简单,因为***类的状态在提交的时候会直接写入本地仓库。而第二个不会。一个文件可以同时具有这两种状态。分支分支的目的是让我们并行开发。.Git/HEAD文件,保存当前分支。一个分支指向一个提交,这就是为什么Git中的分支如此轻量级的原因。因为分支是指向Commit的指针,当提交新的Commit时,只需要更新分支的指向,创建分支只是创建一个指针。Git必备技能常用命令速查gitadd和gitcommitAdd操作是将修改保存到暂存区,Commit是将暂存区的内容保存到本地仓库。每当一个修改过的文件被添加到暂存区时,Git会根据文件的内容计算SHA-1,将内容转换成Blob,写入数据库。然后使用SHA-1值更新此列表中的文件条目。在暂存区的文件列表中,每个文件名都会对应一个SHA-1值,用来指向文件的实际内容。***在提交的那一刻,Git会将这个列表信息转换成项目的快照,它是一个Tree对象。写入数据库,构建一个Commit对象写入数据库。然后更新分支指向。分支合并:合并和变基冲突状态DELETED_BY_THEM;DELETED_BY_US;BOTH_ADDED;BOTH_MODIFIED当遇到无法自动合并的冲突时,Git会将这些状态写入暂存区。merge解决冲突后,我们就可以将修改后的内容作为新的提交提交。这是合并。合并后仍然可以进行新提交。rebaseRebase会将MergeBase中的所有commit以patch的形式一个一个地rebase到目标分支。这样就使得目标分支在合并分支的时候直接FastForward,也就是不会有冲突。Rebase主要在.Git/Rebase-Merge下生成两个文件,分别是Git-Rebase-todo和Done文件。Git-Rebase-todo存储了Rebase将要操作的Commit。而Done存放的是正在操作或者已经完成的Commit。Rebase的一个缺点是它修改了分支的历史提交。如果该分支已经推送到远程仓库,修改后的分支不能向上推送,必须使用-f参数(Force)强制推送。所以使用Rebase***不要在public分支上做。Checkout常用于切换分支,或者切换到某个提交。Checkout找到目标提交(Commit),目标提交中的snapshot,也就是Tree对象,就是我们要checkout的项目的版本。Checkout首先根据Tree生成暂存区的内容,然后根据Tree和它包含的blob转换成我们的工程文件。然后修改HEAD的指向,表示切换分支。Checkout不会修改提交历史。提取对应版本的工程内容即可。revertrevert实现反向提交,即在旧版本中添加的内容必须在新版本中删除;旧版本中删除的内容必须在新版本中添加。这在分支已经被推送到远程存储库的情况下很有用。Revert不会修改历史提交记录。实际操作相当于将target提交的项目快照检出到工作区和暂存区,然后使用新的提交完成版本的“回滚”。reset对当前分支中的版本进行“回滚”,Reset会修改历史提交记录。Reset有三个常用的选项,分别是—Soft、—Mixed、—Hard。它们的范围依次增加。Soft只会修改指向的分支。Mixed没有修改工作区和暂存区的内容,Mixed比Soft多了一个暂存区。实际上,Mixed选项与Soft的区别仅在于一次Add操作。Hard将比Mixed范围多一个工作区。注意:丢失后可以使用GitReset–HardORIG_HEAD立即恢复,或者使用reflog命令查看上一个分支的引用stash。有时候,你在一个分支上做了一些工作,修改了很多代码,你需要切换到另一个分支上做点别的事情。但是您不想提交未完成的工作。Stash提交工作区和暂存区的内容,保存起来,然后使用ResetHard选项恢复工作区和暂存区的内容。我们可以随时使用StashApply应用更改。Stash实现思路是将我们的修改提交到本地仓库,使用一个特殊的分支指针(.Git/refs/Stash)来引用提交,然后在恢复的时候恢复提交。典型的Git实践典型的git并行开发流程模型如下:主分支以origin/master为主分支,源代码的HEAD始终表示production-ready(随时可部署)状态。origin/develop上的代码是为下一次代码发布准备的。日常构建也是基于这个分支。当develop分支达到稳定状态并准备好发布时,所有更改都将合并到master分支并标记版本号。辅助分支Feature分支inheritance和merging与develop分支相关,用于开发新的feature(短期和长期)。创建新功能时,从develop分支创建一个Feature分支。$gitcheckout-bmyfeaturedevelop将功能合并到develop$gitcheckoutdevelopSwitchedtobranch'develop'$gitmerge--no-ffmyfeatureUpdatingea1b82a..05e9557(Summaryofchanges)$gitbranch-dmyfeatureDeletedbranchmyfeature(was05e9557).$gitpushorigindevelopsbranchnamedspec:Inheritanceandbranchmaster:developRelease-CreateareleasebranbranchRelease分支是通过develop分支创建的。$gitcheckout-release-1.2developSwitchedtoanewbranch"release-1.2"$./bump-version.sh1.2文件修改成功,versionbumpedto1.2.$gitcommit-a-m"Bumpedversionnumberto1.2"[release-1.274d9424]Bumpedversionnumberto1.21fileschanged,1insertions(+),1deletions(-)当releasebranch就绪后,需要做几件事。release分支合并到master分支(每次提交到master都是一个新版本,记住)。必须标记master上的提交以供将来查看和回滚。对发布所做的更改必须合并到开发分支中,以确保已修复错误。前两步:$gitcheckoutmasterSwitchedtobranch'master'$gitmerge--no-ffrelease-1.2Mergemadebyrecursive.(Summaryofchanges)$gittag-a1.2为了保存release上的改动到develop,需要合并到develop。$gitcheckoutdevelopSwitchedtobranch'develop'$gitmerge--no-ffrelease-1.2Mergemadebyrecursive。(Summaryofchanges)这一步可能会引起冲突,如果是,解决冲突,然后commit。***,可以删除release分支。$gitbranch-drelease-1.2Deletedbranchrelease-1.2(wasff452fe)。继承分支:master合并分支:develop和master命名约定:hotfix-*运行中发现bug,必须尽快解决。这时候就可以创建Hotfix分支了。解决后合并到master分支。好处是开发者可以继续工作,会有人负责修复bug。创建热修复分支$gitcheckout-bhotfix-1.2.1masterSwitchedtoanewbranch"hotfix-1.2.1"$./bump-version.sh1.2.1Filesmodifiedsuccessfully,versionbumpedto1.2.1.$gitcommit-a-m"Bumpedversionnumberto1.2.1"[hotfix-1.2.141e61bb]Bumpedversionnumberto1.2.11fileschanged,1insertions(+),1deletions(-)fixbug,需要一次或多次提交才能解决问题$gitcommit-m"Fixedsevereproductionproblem"[hotfix-1.2.1abbe5d6]Fixedsevereproductionproblem5fileschanged,32insertions(+),17deletions(-)当hotfix分支完成后,bugfix会合并到master中,同时也会合并到develop中,以确保下一个版本发布时bug已经修复。这与发布分支完成时相同。首先更新master和tagrelease$gitcheckoutmasterSwitchedtobranch'master'$gitmerge--no-ffhotfix-1.2.1-1.2.1Mergemadebyrecursive。(Summaryofchanges)有个例外,就是当有release分支存在时,bugfixes应该合并到release而不是develop,因为release最终会合并到develop。***删除分支$gitbranch-dhotfix-1.2.1Deletedbranchhotfix-1.2.1(wasabbe5d6)。总结和了解Git在软件工程和敏捷开发中的地位,了解git与其他版本控制工具的区别,掌握Git工作的基本原理和必要的操作,复杂问题可以找到git相关命令,应用流程模型由git开发,让Git成为我们真正的武器。【本文来自专栏作家老曹的原创文章,作者微信公众号:哦家ArchiSelf,id:wrieless-com】
