GIT使用培训谭宗威2014-07-29欢迎•版本管理的作用1•常用版本管理介绍2•版本管理的工作模式3•Git介绍4•Git日常工作模式5今天的内容概述学习目标•版本管理的作用•掌握日常的操作•团队协作版本管理的作用为什么要版本管理?文件管理历史追踪冲突管理版本发布团队协作常用版本管理介绍常见的版本管理软件简称全名CVSConcurrentVersionsSystemVSSMicorosoftVisualSourceSafeSVNSubversionGitTFSTeamFoundationServerMercurialClearCaseIBMRationalClearCasePerforce版本管理的工作模式灵活性健壮性单机版(文件系统,RCS)分布式(Git、Mercurial)发展过程集中式(CVS,SVN)本地计算机版本库本地版本管理版本库:个人电脑/服务器RCS:RevisionControlSystem可追踪修改历史问题:如何协作?Version3Version2Version1file检出计算机Afile检出版本服务器版本库集中式版本管理版本库:版本服务器VCS:VersionControlSystem又称CVCS(CentralVCS)有SVN、CVS、firefly等产品问题:服务器会停网络会不通Version3Version2Version1计算机Bfile检出版本服务器版本库分布式版本管理版本库版本服务器个人计算机VCS:又称DVCS(DistributedVCS)有GIT、HG、bazaar等产品问题:乱成一团?分支管理机制Version3Version2Version1计算机A版本库Version3Version2Version1计算机B版本库Version3Version2Version1file检出file检出协作模式•锁定模型•冲突合并模型常用术语•分支(Branch):在一个时间点,复制一份处于版本控制之下的文件,从这之后,这两份拷贝就可以独立的互不干扰的进行各自开发。•取出(Check-out):一次“取出”,就是在本地创建一份仓库的工作拷贝。•提交(Commit):一次“提交”,将本地的修改写回到仓库或合并到仓库。•冲突(Conflict):当开发者们同时提交对同一文件的修改,而且版本系统不能把它们合并到一起,就会引起冲突,就需要人工来进行合并。•合并(Merge):合并就是把所有对文件的修改统一到文件里•仓库(Repository):仓库就是当前的和历史的处于版本控制之下的文件所在的地方,通常在服务器端。•工作版本(Workingcopy):从档案库中取出一个本地端的复制,所有在档案库中的档案更动,都是从一个工作版本中修改而来的,这也是这名称的由来。GIT介绍Git的诞生•2002年以前–Linus个人以diff方式管理•2002年至2005年–BitMover公司的BitKeeper•2005年以后–Linus两个月开发出GitGit的发展•大部份开源软件•Github.com•Gitcafe.com•Code.csdn.net•Coding.netGIT设计目标满足大规模项目需要快速简单完全分布高效存储版本服务器版本库GIT工作模式版本库初始化个人计算机从版本服务器同步操作90%以上的操作在个人计算机添加文件修改文件提交变更查看版本历史等版本库同步将本地修改传送到版本服务器Version3Version2Version1计算机A版本库Version3Version2Version1计算机B版本库Version3Version2Version1file检出file检出GIT文件存储第二部分GIT基础版本库结构Tortoisegit设置创建版本库版本库:repository创建方法执行gitinit示例工作目录:E:\Repositories\GIT\RCMSDemo在工作目录中点击鼠标右键.git目录版本库:暂存区和对象库第一个提交创建文件Readme.txt使用gitadd命令添加Readme.txt使用gitcommit提交Readme.txt修改文件修改Readme.txt使用gitadd命令添加Readme.txt使用gitcommit提交Readme.txt克隆版本库示例版本服务器:gitserver版本服务器用户:gitusr版本库:RCMSDoc本地目录:F:\git文件状态a工作区版本库版本管理工作区工作目录:.git文件夹所处目录文件状态未跟踪:处于工作目录,但未被版本库管理的文件已跟踪:已被版本库管理的文件,可能存在于工作目录,也可能不存在于工作目录中GIT文件状态工作区暂存区对象库修改文件暂存文件提交文件检出文件GIT文件已被版本库管理的文件已修改在工作目录修改GIT文件已暂存对已修改的文件执行git暂存操作,将文件存入了暂存区已提交将已暂存的文件执行git提交操作,将文件存入对象库本地计算机版本库VersionmVersion…Version1file本地版本库与服务器版本库(一)版本服务器版本库Version3Version2Version1本地计算机版本库Version3Version2Version1file检出gitadd、commit…gitpull版本服务器版本库VersionmVersion…Version1①②远程协作(一)创建文件Readme.txt使用gitadd命令添加Readme.txt使用gitcommit提交Readme.txt至本地版本库xt使用gitpush保存Readme.txt到服务器版版本服务器版本库VersionxVersion…Version1本地计算机版本库VersionmVersion…Version1本地版本库与服务器版本库(二)版本服务器版本库Version3Version2Version1本地计算机版本库Version3Version2Version1gitadd、commit…gitpull①②③版本服务器版本库VersionnVersion…Version1gitpush本地计算机版本库VersionxVersion…Version1远程协作(二)修改Readme.txt使用gitadd命令添加Readme.txt使用gitcommit提交Readme.txt使用gitpull获取服务器版本库更新使用gitpush将Readme.txt保存至版本服务器GIT常用命令获得版本库gitinitgitclone版本管理gitaddgitrmgitcommit远程协作gitpullgitpush查看信息githelpgitloggitdiff第三部分GIT进阶再谈暂存区和对象库暂存区一个文件:.git/index对象库一个目录:.git/objects存放版本库的各种对象对象对象每个对象都是一个文件每个对象都用40位的SHA-1值标识:6ff87c4664981e4397625791c8ea3bbb5f2279a3前两位作为目录名,后38位作为文件名对象组成类型:blob、tree、commit和tag内容:对象文件的内容大小:内容的大小对象类型blob是一个文件存储文件的内容tree是一个文件类似一个目录包含其它tree和blobcommit是一个文件包含时间、作者、一个tree的标识、父commit的标识tag是一个文件包含一个commit的标识案例blobtreecommit对象模型gitstatus工作区相比暂存区新增文件修改文件删除文件一致(gitadd)暂存区相比对象库新增文件(gitadd)修改文件(gitadd)删除文件(gitrm)一致(gitcommit)暂存区仅保留对象库当前分支的快照,gitcommit将会替换当前快照,使得暂存区与对象库的当前分支最新更新一致gitrmGIT通常只会增加内容,不用担心丢失曾经有的数据GIT也支持彻底清除确认无效的数据,属于更高级的内容第四部分分支管理分支概念一个commit对象链:一条工作记录线master主分支默认分支主体功能开发综合信息一个文件:.git/refs/heads/master文件内容:commit对象的SHA-1值HEAD当前commit对象引用一个文件:.git/HEAD文件内容:分支引用(ref:refs/heads/master)commit对象的SHA-1值(4c9f4…)再谈分支概念一个文件:位于.git/refs/heads目录下文件内容:commit对象的SHA-1值分支管理创建分支:gitbranchbranchname删除分支:gitbranch–dbranchname在分支上工作切换到分支gitcheckoutbranchname用分支对应的快照更新暂存区和工作区分支合并gitmergebranchname冲突冲突:修改了两个待合并分支里同一个文件的同一部分(比如同一行)冲突产生冲突解决第五部分团队协作远程版本库管理gitcloneurl:生成一个叫orgin的远程版本库gitremote–v:查看远程版本库信息gitremoteaddremotereponameurl:指定版本库名字路径.git/refs/remotes/远程分支路径.git/refs/remotes/remotereponame/访问方式remotereponame/branchname:origin/master跟踪分支(trackingbranch)gitcheckoutremotereponame/remotebranchnamegitcheckout–bbranchnameremotereponame/remotebranchname从远程版本库抓取数据gitfetch[remotereponame]gitfetch=gitfetchorigin从远程仓库中拉取本地仓库中还没有的数据(所有分支)需要执行gitcheckout跟踪远程分支,从而产生本地分支再谈克隆版本库gitcloneurlgitinitreponamegitremoteaddoriginurlgitfetchorigingitcheckoutorigin/master推送数据给远程版本库gitpush[remotereponame][branchname]将本地分支branchname推送给remotereponame的branchname分支gitpush如果当前分支为跟踪分支,则推送至其跟踪的远程分支否则=gitpushorigin,将当前分支推送给origin,在origin上的分支名称与当前分支名称相同本地计算机版本库masterbranch1gitpull版本服务器版本库masterbranch1branch2本地分支远程分支masterBranch1branch2gitfetchgitmergegitcheckoutmastergitpullgitmergegitcheckoutbranch1gitpull删除远程分支gitpush:remotebranchname提问?