版本管理工具介绍—Git篇tony.tang@corp.to8to.com2019/10/6版本管理工具是干什么用的?•备份文件(U盘)•记录历史(回到过去)•多端共享(苹果)•独当一面(一个英雄)•团队协作(多个英雄)2019/10/6版本管理工具发展历史•cvs始祖、集中式、1985•svn集大成者、集中式、2000•Gitgeek主流、分布式、2005•githubgeek社区、托管网站、20082019/10/6版本回退我们不断的修改,不断的提交,不断的更新到版本库中,假如线上的代码突然挂了,我需要回到上一个版本,或者需要回到某一个版本,这个时候需要怎么弄?你能想得到的,git都可以做得到2019/10/6gitdiff•gitdiff查看工作目录与索引区(当前暂存区)文件之间的差异•gitdiff--cached查看索引区与本地git仓库之间的差异•gitdiffHEAD显示工作目录与本地git仓库之间的差异•gitdiffHEAD^比较上次提交和gitdiffHEAD~1同等•gitdiffHEAD~2比较上2次提交•gitdiff--stat显示修改的文件的个数和行数•gitdifftool使用图形工具来显示文件的差异(需要安装diff.tool)2019/10/6历史提交对比•gitdiffcommit-ID将指定的某次提交与当前的目录对比•gitdiffcommit1commit2将两次提交的内容相比,gitdiffcommit2commit1比较的结果不一样,是相反的(线上提工单的时候应该就用的这个)•也等价于gtidiffcommit1..commit2如何省略任意一个commit则默认使用HEAD代替•commit可以是简写的commit哈希值,也可以是HEAD。其中HEAD代表最后一次提交,HEAD^代表最后一次提交的父提交,HEAD~1代表最后一次提交的父提交,HEAD~1等价于HEAD^,HEAD~2代表倒数第二次提交,以此类推HEAD^^HEAD~100。•如果gitstatus告诉你有文件被修改过了以后,则可以用gitdiff来查看修改的内容2019/10/6gitlog线上代码突然怪了,这个时候需要怎么弄?gitlog(觉得太乱?加下面的参数试试)•--pretty=oneline•--graph•--abbrev-commit•--decorate•--color--graph--pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(boldblue)%an%Creset'--abbrev-commit(这是神马~~~)2019/10/6版本号•3628164...882e1e0commitid•git和SVN不一样,Git的commitid不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commitid和我的肯定不一样,以你自己的为准。•为什么commitid需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。2019/10/6时间线•我们在每提交一个新版本的时候,可以理解为一条时间线(git其实就是这样做的),我们慢慢往前走,走到一个点,做一个标记,这样就会很清新看到自己所走过的路了•(TortoiseGit,这个工具就可以清晰的看到)2019/10/6gitreset•gitreset--hardHEAD^时光穿梭到上一个版本(HEAD永远代表当前版本,你如果穿梭了时空,也就回重新指向穿梭后的版本)•gitreset--hardcommit-id(这里的版本号,写前面几位就可以了,保持唯一就行,git会自动去找,一般写7位)•这个时候,你如果找出了线上的问题,又需要回到最新版本,这个时候查看log也找不到最新版本,这可怎么办~•别急,还是那句话,你能想到的,git都可以办得到。•可以用gitreflog试试,因为他会记录你每一次操作,这个时候你就可以找到你的版本号了。happy吧!2019/10/6时间线•我们在每提交一个新版本的时候,可以理解为一条时间线(git其实就是这样做的),我们慢慢往前走,走到一个点,做一个标记,这样就会很清新看到自己所走过的路了•(TortoiseGit,这个工具就可以清晰的看到)2019/10/6工作区和索引区(暂存区)和版本库git和其他版本控制系统,如SVN的一个不同之处就是有暂存区的概念暂存区是GIT非常重要的概念,弄明白了暂存区,就弄明白了GIT的很多操作到底干了什么(请务必把把这一点弄明白)2019/10/6管理修改•1、为什么git比其他版本控制系统设计得优秀•因为git跟踪并管理的是修改,而并不是文件•2、什么是修改?•新增一行、删除一行、更改了字符、删除一些,增加一些、甚至创建一个新文件也是一个修改•3、文件alter-gitadd-alter-commit这个时候由哪里提交到哪里,提交的是什么?2019/10/6撤销修改•根据”澳姐,你又胖了“举个例子“•需要用到的命令•gitcheckout--file(丢弃掉工作区文件文件修改)(和gitcheckoutname的区别)•gitresetHEADfile(把暂存区的修改撤销掉unstage,重新放回到工作区)2019/10/6删除文件•gitrm(rm-rf)基本操作命令需要学习•有两种情况,•1、是需要删除版本库文件,需要delete-add-commit•2、删除了不该删除的文件(又找不到备份文件),上面学过,gitresetHEADfile一样可以找回来,如果add了,只要没有commit,依然可以重复撤销修改的操作2019/10/6远程仓库•1、添加远程仓库•2、从远程仓库克隆2019/10/6分支管理但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。(其实其他的版本管理工具都有,但是:比蜗牛还慢)2019/10/6创建与合并分支•你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。•HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。2019/10/6创建与合并分支2019/10/6创建与合并分支•gitbranch查看分支•gitbranchname创建分支•gitcheckoutname切换分支•gitcheckout-bname创建+切换分支•gitmergename合并某分支到当前分支•gitbranch-d(-D)name删除分支2019/10/6Git分支模式•主要分支•辅助分支2019/10/6主要分支•中央仓库中有两个长期的分支:•master•develop•master用作生产分支,里面的代码是准备部署到生产环境的。•develop是可交付的开发代码,也可以看成是用于集成分支,每晚构建从develop获取代码。•当develop分支中的代码足够稳定的时候,就将改动合并到master分支,同时打上一个标签,标签的名称为发布的版本号。2019/10/6辅助分支通过辅助分支来帮助并行开发,和主要分支不同,这些分支的生命周期是有限的:1、特性分支(开发需求的分支,从develop分出,最终必需合回develop)•gitbranch-bname1name2(创建分支1,从分支2分出)2、发布分支•(一般从develop中分出,最终必需合回develop和master,发布分支以release-*的方式命名,包括一些小bug的修正和发布的元信息【版本号,发布日期等】)3、紧急修复分支•(一般从master分出,必需合并回develop(如果存在发布分支,则需要合并到发布分支【因为发布分支最终会合并到develop】)和master)2019/10/6gitstashstash是干什么的?为什么要用stash?•gitstash•gitstashlist•gitstashapplyname默认当stash@{0}•gitstashpopname2019/10/6gitmerge•fast-forwardgit直接把HEAD指针指向合并分支的头,完成合并。•--no-ff:不使用fast-forward方式合并,保留分支的commit历史•--squash:使用squash方式合并,把多次分支commit历史压缩为一次(压缩以后,还需要重新commit一次,不然只是合并过来在暂存区里面的)2019/10/6解决冲突2019/10/6标签管理•gittag-atagName-m'Remark'commit-id•-a指定标签名•-m指定说明文字•-s用私钥签名一个标签(签名采用~~~~~~必需安装~~~~)•gitshowtagName查看tag信息•gittag-dtagName删除本地tag•gitpushorigintagName把tag提到远程分支•gitpushorigin--tags把所有tag提到远程分支•gitpushorigin:refs/tags/tagName删除远程分支tag2019/10/6自定义Git•忽略特殊文件•.gitignore•配置别名(--global全局)•gitconfig--globalalias.ststatus(co,ci,br等)•配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。•gitconfig--globalalias.lglog--color--graph--pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(boldblue)%an%Creset'--abbrev-commit2019/10/6其他1.安装Git+运行配置2.创建版本库3.分支的衍合4.使用Github5.服务器上的Git6.Git工具7.自定义Git8.Git与其他系统9.Git内部原理2019/10/6ENDThanks!!!