当前位置: 首页 > 科技观察

为什么互联网巨头都使用Git而放弃SVN?

时间:2023-03-12 05:09:09 科技观察

作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多的童鞋,这里提供一个开源框架地址:https://github.com/sunshinelyz/mykit-delay写在前面最近发现很多小伙伴对一些的使用不太了解工作中的基本工具,比如:Git是一个分布式代码管理仓库,很多朋友不是很了解,或者不是很熟悉。甚至有些朋友从来没有听说过Git,所以只会用SVN。众所周知,当今各大互联网巨头和新兴的互联网黑马公司,基本都在使用Git,而基本放弃了SVN的使用。为什么?一起往下看吧。Git和SVN的区别在于存储方式不同。Git将内容存储为元数据,类似于k/v数据库,而SVN将内容存储为文件(新版SVN改为元数据存储)。在这里,我们给出一个简单的Git使用示例。cd.git/objects/df/gitcat-file-pdf70460b4b4aece5915caf5c68d12f560a9de56eecho'version1'>text.txtgithash-object-wtext.txt使用不同的方式将文件从本地推送到远程服务,SVN只需要commit,而Git需要add,commit,推三步。比如我们用下图来模拟SVN的使用。我们可以用下图来模拟Git的使用过程。版本管理方式不同。Git是分布式版本管理系统,而SVN是远程集中管理系统。比如我们可以用下图来表示SVN的集中管理。我们可以用下图来表示Git的分布式管理。Git核心命令总结Git客户端安装官方客户端下载:https://git-scm.com/downloads其他客户端下载:https://tortoisegit.org/download/Git命令的使用(一)基于远程仓库克隆到本地gitclone(2)当前目录初始化为git本地仓库gitinit(3)根据mvn模板创建项目mvnarchetype:generatelocaladd(1)添加指定文件到暂存areagitadd(2)添加指定目录到暂存区gitadd(3)添加所有gitadd-A(4)从暂存区移除指定目录和子目录gitrm--cachedtarget-r(5)添加ignoreconfigurationfile.gitignorelocal提交(1)提交到本地仓库gitcommitfile-m'提交评论信息'(2)快速提交到本地仓库gitcommit-am'快速添加提交'分支管理(1)查看当前分支gitbranch[-avv](2)新建基于当前分支的分支gitbranch(3)根据commit创建新分支gitbranch$gitbranch-d{dev}(4)切换分支gitcheckout(5)合并分支gitmerge(6)解决冲突。如果由于冲突导致自动合并失败,则状态为正在合并。需要手动修改重新提交(commit)远程仓库管理(1)查看远程配置gitremote[-v](2)添加远程地址gitremoteaddoriginhttp:xxx.xxx(3)删除远程地址gitremoteremoveorigin(4)上传新分支到远程gitpush--set-upstreamoriginmaster(5)关联本地分支与远程gitbranch--track--set-upstream-to=origin/testtest标签管理(1)查看当前gittag(2)创建分支gittag(3)删除分支gittag-d日志管理(1)查看当前分支gitlog下所有提交日志(2)查看当前分支下所有提交日志gitlog{branch}(3)单行显示日志gitlog--oneline(4)比较两个版本的区别gitlogmaster..experiment(5)以图形方式展示commitmergenetworkAddressablefilesystem,其核心部分是一个简单的键值数据库(key-valuedatastore),你可以向数据库中插入任意内容,它会返回一个hashkey用于检索值。(1)向Git键值库中插入数据echo'binghe'|githash-object-w--stdin79362d07cf264f8078b489a47132afbc73f87b9a(2)根据key获取指定内容数据库中,要进行版本回滚时,一个的键用于检索和替换它。Git版本写入及回滚过程(1)查找所有git对象,如find.git/objects/-typef(2)写入版本1echo'version1'>README.MF;githash-object-wREADME.MF;(3)写入版本2echo'version2'>README.MF;githash-object-wREADME.MF;(4)写版本3echo'version3'>README.MF;githash-object-wREADME.MF;(5)回滚指定Versiongitcat-file-pc11e96db44f7f3bc4c608aa7d7cd9ba4ab25066e>README.MF所以我们平时使用的gitadd其实就是将修改后的内容插入到key-value库中。当我们执行gitaddREADME.MF时,相当于执行githash-object-wREADME.MF将文件写入数据库。我们解决了存储的问题,但是它只能存储内容,不能存储文件名。如果要回滚,怎么知道哪个内容对应哪个文件呢?接下来我们来看树对象,它解决了文件名存储的问题。Git树对象树对象解决了文件名的问题。它的目的是将多个文件名组织在一起,其中包含多个文件名及其对应的Key和对其他树对象的引用。可以理解为操作系统。在文件夹中,一个文件夹包含多个文件和多个其他文件夹。每个分支都与一个树对象相关联,该对象存储当前分支下的所有文件名和对应的键。可以通过以下命令查看gitcat-file-pmaster^{tree}Git提交对象。提交是当前版本的快照。快照是通过提交对象保存的。存储的内容是:一个顶级树对象,最后一次提交的对象,提交者的用户名和邮箱,提交时间戳,提交评论。$gitcat-file-pb2395925b5f1c12bf8cb9602f05fc8d580311836tree002adb8152f7cd49f400a0480ef2d4c09b060c07parent8be903f5e1046b851117a21cdc3c80bdcaf97570authorbinghe1532959457+0800committerbinghe1532959457+0800综上,我们可以推测出从修改一个文件到提交的过程总共生成了三个对象:一个内容Object:storethefilecontentatreeobject:storethefilenameandthekeyofthecontentobjectasubmitobject:storethekeyofthetreeobjectandsubmitcomments.Gitreferencecreatesabranchwhenweexecutegitbranch{branchName},whichessentiallycreatesareferencefilebasedonthespecifiedcommitingitandsavesitunder.git\refs\heads\.(1)Createabranchgitbranchdevcat.git\refs\heads\devGithasatotalofthreetypesofreferences:branchreferenceremotebranchreferencelabelreference(2)queryandcomparetwoversionsgitlogmaster..experiment(3)versioncommithistorynetworkgitlog--pretty=format:'%h%s'--graph(4)Viewthebranchtreegitcat-file-pmaster^{tree}ThisarticleisreprintedfromWeChat公众号「IceRiverTechnology」,youcanfollowitthroughthefollowingQRcode.Toreprintthisarticle,pleasecontactGlacierTechnology公众号.