科技网站哪个好,网站建设实训总结2000字,仿牌网站安全,设计制作小车一微课一、 集中式vs分布式1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器#xff0c;保存所有文件的修订版本#xff0c;而协同工作的人们都通过客户端连到这台服务器#xff0c;取出最新的文件或者提交更新。Subversion的特点概括起…一、 集中式vs分布式1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器保存所有文件的修订版本而协同工作的人们都通过客户端连到这台服务器取出最新的文件或者提交更新。Subversion的特点概括起来主要由以下几条 每个版本库有唯一的URL(官方地址)每个用户都从这个地址获取代码和数据 获取代码的更新也只能连接到这个唯一的版本库同步以取得最新数据 提交必须有网络连接(非本地版本库) 提交需要授权如果没有写权限提交会失败 提交并非每次都能够成功。如果有其他人先于你提交会提示“改动基于过时的版本先更新再提交”… 诸如此类 冲突解决是一个提交速度的竞赛手快者先提交平安无事手慢者后提交可能遇到麻烦的冲突解决。好处每个人都可以一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限。缺点中央服务器的单点故障。若是宕机一小时那么在这一小时内谁都无法提交更新、还原、对比等也就无法协同工作。如果中央服务器的磁盘发生故障并且没做过备份或者备份得不够及时的话还会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录被客户端提取出来的某些快照数据除外但这样的话依然是个问题你不能保证所有的数据都已经有人提取出来。Subversion原理上只关心文件内容的具体差异。每次记录有哪些文件作了更新以及都更新了哪些行的什么内容。2. Git属于分布式的版本控制系统Git记录版本历史只关心文件数据的整体是否发生变化。Git 不保存文件内容前后变化的差异数据。实际上Git 更像是把变化的文件作快照后记录在一个微型的文件系统中。每次提交更新时它会纵览一遍所有文件的指纹信息并对文件作一快照然后保存一个指向这次快照的索引。为提高性能若文件没有变化Git 不会再次保存而只对上次保存的快照作一连接。在分布式版本控制系统中客户端并不只提取最新版本的文件快照而是把原始的代码仓库完整地镜像下来。这么一来任何一处协同工作用的服务器发生故障事后都可以用任何一个镜像出来的本地仓库恢复。这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此你就可以在同一个项目中分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程。另外因为Git在本地磁盘上就保存着所有有关当前项目的历史更新并且Git中的绝大多数操作都只需要访问本地文件和资源不用连网所以处理起来速度飞快。用SVN的话没有网络或者断开VPN你就无法做任何事情。但用Git的话就算你在飞机或者火车上都可以非常愉快地频繁提交更新等到了有网络的时候再上传到远程的镜像仓库。换作其他版本控制系统这么做几乎不可能抑或是非常麻烦。Git具有以下特点Git中每个克隆(clone)的版本库都是平等的。你可以从任何一个版本库的克隆来创建属于你自己的版本库同时你的版本库也可以作为源提供给他人只要你愿意。Git的每一次提取操作实际上都是一次对代码仓库的完整备份。提交完全在本地完成无须别人给你授权你的版本库你作主并且提交总是会成功。甚至基于旧版本的改动也可以成功提交提交会基于旧的版本创建一个新的分支。Git的提交不会被打断直到你的工作完全满意了PUSH给他人或者他人PULL你的版本库合并会发生在PULL和PUSH过程中不能自动解决的冲突会提示您手工完成。冲突解决不再像是SVN一样的提交竞赛而是在需要的时候才进行合并和冲突解决。Git 也可以模拟集中式的工作模式Git版本库统一放在服务器中可以为 Git 版本库进行授权谁能创建版本库谁能向版本库PUSH谁能够读取(克隆)版本库团队的成员先将服务器的版本库克隆到本地并经常的从服务器的版本库拉(PULL)最新的更新团队的成员将自己的改动推(PUSH)到服务器的版本库中当其他人和版本库同步(PULL)时会自动获取改变Git 的集中式工作模式非常灵活你完全可以在脱离Git服务器所在网络的情况下如移动办公出差时照常使用代码库你只需要在能够接入Git服务器所在网络时PULL和PUSH即可完成和服务器同步以及提交Git提供 rebase 命令可以让你的改动看起来是基于最新的代码实现的改动Git 有更多的工作模式可以选择远非 Subversion可比二、 版本库与工作区Subversion的工作区和版本库是截然分开的而Git的工作区和版本库是如影随形的。1. SVN的版本库和工作区是分离的• Subversion 的工作区和版本库物理上分开Subversion的版本库和工作区是存储在不同路径下一般是在不同的主机中Subversion的企业级部署中版本库在服务器上只能通过 https, http, svn 等协议访问而不能直接被用户接触到。• Subversion的工作区是一份版本库在某个历史状态下的快照如版本库最新的数据检出到工作区。• Subversion的工作区中每一个目录下都包含一个名为 .svn 的控制目录(隐藏的目录)该目录的作用是① 标识工作区和版本库的对应关系。② 包含一份该子目录下检出文件的原始拷贝。当文件改动的差异比较或者本地改动的回退时可以直接参考原始拷贝而无须通过网络访问远程版本库。• Subversion 的 .svn 控制目录会引入很多麻烦① .svn 下的文件原始考本会导致在目录下按照文件内容搜索时多出一倍的搜索时间和搜索结果。② .svn 很容易在集成时引入产品中尤其是 Web 应用将 .svn 目录带入Web服务器会导致安全隐患。因为一个不允许目录浏览的Web目录可以通过 .svn/entries 文件查看到该目录下可能存在的文件。2 .Git 的版本库和工作区如影随形• Git 的版本库和工作区在同一个目录下工作区的根目录有一个.git的子目录这个名为 .git的目录就是版本库本身它是Git 用来保存元数据和对象数据库的地方。该目录非常重要每次克隆镜像仓库的时候实际拷贝的就是这个目录里面的数据。所以千万要小心删除这个文件。• 工作区中其他文件为工作区文件可能是从 .git 中检出的或者是要检入的或者是运行产生的临时文件等。• 版本库可以脱离工作区而存在成为 bare(赤裸)版本库。可以用 –bare 参数来创建。但是工作区不能脱离版本库而存在即工作区的根目录下必须有一个名为 .git 的版本库克隆文件。• Git 的版本库因为就在工作区中能直接被用户接触到。① 用户可以编辑 .git/config 文件修改配置增添新的源② 用户可以编辑 .git/info/exclude 文件创建本地忽略…• Git 的工作区中只在工作区的根目录下有一个 .git 目录此外再无任何控制目录。Git 工作区下唯一的 .git 目录是版本库并非 .svn 的等价物如果删除了 .git 目录而又没有该版本库的其他镜像(克隆)的话你破坏了整个历史版本库也永远的失去了。• Git 在本地的 .git 版本库提供了完全的改动历史。除了和其他人数据交换外任何版本库相关的操作都在本地完成更多的本地操作避免了冗长的网络延迟大大节省了时间。例如查看 log切换到任何历史版本等操作都无须连接网络。• Git如何保证安全本地创建一个Git库因为工作区和库是在同一个目录中如果工作区删除了或者所在的磁盘分区格式化了数据不是全都没有了么其实我们可以这样做① 在一个磁盘分区中创建版本库(最好是用 –bare 参数创建)然后在另外的磁盘分区中克隆一个新的作为工作区。在工作区的提交要不时的PUSH到另外分区的版本库这样就实现了本地的数据镜像。你甚至可以在本地创建更多的版本库镜像安全性要比Subversion的一个库加上一个工作区安全。② 另一个办法把你的版本库共享给他人当他人克隆了你的版本库时你就拥有了一个异地备份。三、 全局版本号和全球版本号SVN的全局版本号和CVS的每个文件都独立维护一套版本号相比是一个非常大的进步。在看似简单的全局版本号的背后是Subversion提供对于事物处理的支持每一个事物处理(即一次提交)都具有整个版本库全局唯一的版本号。Git的版本号则更进一步版本号是全球唯一的。Git 对于每一次提交通过对文件的内容或目录的结构计算出一个SHA-1 哈希值得到一个40位的十六进制字符串Git将此字符串作为版本号。1. SVN与Git版本号比较• 所有保存在Git 数据库中的数据都是用此40位的哈希值作索引的而不是靠文件名。• 使用哈希值作版本号的好处就是对于一个分布式的版本控制系统每个人每次提交后形成的版本号都不会出现重复。另一好处是保证数据的完整性因为哈希值是根据内容或目录结构计算出来的所以我们还可以据此来判断数据内容是否被篡改。• SVN 的版本号是连续的可以预判下一个版本号而 Git 的版本号则不是。因为 subversion 是集中式版本控制很容易实现版本号的连续性。Git 是分布式的版本控制系统而且 Git 采用 40 位长的哈希值作为版本号每个人的提交都是各自独立完成的没有先后之分(即使提交有先后之分也由于PUSH/PULL的方向和时机而不同)。Git 的版本号虽然不连续但是是有线索的即每一个版本都有对应的父版本(一个或者两个)进而可以形成一个复杂的提交链• Git 的版本号简化Git 可以使用从左面开始任意长度的字串作为简化版本号只要该简化的版本号不产生歧义。一般采用7位的短版本号(只要不会出现重复的你也可以使用更短的版本号)。四、 部分检出Subversion可以将整个库检出到工作区也可以将某个目录检出到工作区。对于要使用一个庞大、臃肿的版本库的用户来说部分检出是非常方便和实际的。但是Git只能全部检出不支持按照目录进行的部分检出。1. SVN的部分检出• 在SVN中从仓库checkout的一个工作树每个子目录下都维护着自己的.svn目录记录着该目录中文件的修改情况以及和服务器端仓库的对应关系。所以SVN可以checkout部分路径下的内容(部分检出)而不用checkout整个版本库或分支。• Subversion 有一条命令svn export 可以将 subversion 版本库的一个目录下所有内容导出到指定的目录下。Subversion 需要 svn export 命令是因为该命令可以导出一个干净的目录即不包含 .svn 目录(包含配置文件和文件原始拷贝)。2. Git的检出• Git 没有部分检出这并不是说只有将整个库克隆下来才能查看文件。有很多 git 工具提供直接浏览git库的功能例如 gitweb, trac 的 git 版本库浏览, redmine 的 git 版本库浏览。• Git-submodule 可以实现版本库的模块化Git 通过子模块处理这个问题。子模块允许你将一个Git 仓库当作另外一个Git仓库的子目录。这允许你克隆另外一个仓库到你的项目中并且保持你的提交相对独立。• Git 为什么没有实现 svn export 的功能由于git的本地仓库信息完全维护在project根目录的.git目录下(不像svn一样每个子目录下都有单独的.svn目录)。所以只要clonecheckout然后删除.git目录就可以了。五、 更新和提交1更新操作在SVN中因为只有一个中心仓库所以所谓的远程更新也就是svn update ,通过此命令来使工作区和版本库保持同步。对于git来说别人的改动是存在于远程仓库上的所以git checkout命令尽管在某些功能上和svn中的update类似(例如取仓库特定版本的内容)但是在远程更新这一点上还是不同的不属于git checkout的功能涵盖范围。 Git使用git fetch和git pull来完成远程更新任务fetch操作只是将远程数据库的object拷贝到本地然后更新remotes head的refsgit pull 的操作则是在git fetch的基础上对当前分支外加merge操作。2SVN中的commit命令对于SVN来说由于是中心式的仓库管理形式所以并不存在特殊的远程提交的概念所有的commit操作都可以认为是对远程仓库的更新动作。在工作区中对文件进行添加、修改、删除操作要同步到版本库必须使用 commit命令。• add 命令是将未标记为版本控制状态的文件标记为添加状态并在下次提交时入库。• delete命令是通过SVN来删除文件并在下次提交后有效。• Subversion 有提交列表功能即将某些文件加入一个修改列表提交可以只提交处于该列表的文件。3Git中的暂存区域(stage)Git 管理项目时文件在三个工作区域中流转Git 的本地数据目录工作目录以及暂存区域。暂存区域(stage)是介于 workcopy 和 版本库 HEAD 版本的一种中间状态。所谓的暂存区域只不过是个简单的文件一般都放在git 目录中。有时候人们会把这个文件叫做索引文件不过标准说法还是叫暂存区域。要将一个文件纳入版本管理的范畴首先是要用git add将文件纳入stage的监控范围只有更新到stage中的内容才会在commit的时候被提交。另外文件本身的改动并不会自动更新到stage中每次的任何修改都必须重新更新到stage中去才会被提交。对于工作区直接删除的文件需要用 git rm 命令进行标记在下次提交时在版本库中删除。• 工作区的文件改动(新增文件修改文件删除文件)必须用 git add 或者 git rm 命令标识使得改动进入 stage• 提交只对加入 stage 的改动进行提交• 如果一个文件改动加入 stage 后再次改动则后续改动不改变 stage。即该文件的改动有两个状态一个是标记到 stage 中并将在下次提交时入库的改动另外的后续改动则不被提交除非再次使用 git add 命令将改动加入到 stage 中。• Git的stag让你在提交的时候清楚的知道git将要提交哪些改动。除非提交的时候使用 -a 参数(不建议使用)。我们可以从文件所处的位置来判断其状态如果是git目录中保存着的特定版本文件就属于已提交状态如果作了修改并已放入暂存区域就属于已暂存状态如果自上次取出后作了修改但还没有放到暂存区域就是已修改状态如果取出后未进行修改则是未修改状态。在git中因为有本地仓库和remote仓库之分所以也就区别于commit 操作存在额外的push命令用于将本地仓库的数据更新到远程仓库中去。git push 可以选择需要提交的、更新的分支以及制定该分支在远程仓库上的名字。六、 分支和里程碑的实现几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来然后在不影响主线的同时继续工作。在很多版本控制系统中这是个昂贵的过程常常需要创建一个源代码目录的完整副本对大型项目来说会花费很长时间。轻量级分支/里程碑的含义是创建分支/里程碑的复杂度是o(1)不会因为版本库的愈加庞大而变得缓慢。在CVS中创建分支的复杂度是o(n)的导致大的版本库的的分支创建非常缓慢。1Subversion的分支/里程碑Subversion轻量级分支和里程碑的实现是通过svn cp命令即带历史的拷贝就是创建快速创建分支和里程碑的秘籍。Subversion的版本库有特殊的设计当你复制一个目录你不需要担心版本库会变得十分巨大—Subversion并不是拷贝所有的数据相反它只是建立了一个已存在目录树的入口。这种“廉价的拷贝”就是创建分支/里程碑是轻量级的原因。由于Svn的分支和标签是来自目录拷贝约定俗成是拷贝在 branches/和tags/目录下。所谓分支tag等概念都只是仓库中不同路径上的一个对象或索引而已和普通的路径并没有什么本质的区别谁也不能阻止在一个提交中同时修改不同分支中的数据。里程碑是对某个历史提交所起的一个别名作为历史的标记是不应该被更改的。svn的里程碑要建立到 tags/目录下要求不要在tags/下的里程碑目录下进行提交。但是谁也阻止不了对未进行权限控制的里程碑的篡改。2Git 的轻量级分支和里程碑Git中的分支实际上仅是一个包含所指对象校验和(40个字符长度SHA-1 哈希值)的文件所以创建和销毁一个分支就变得非常廉价。说白了新建一个分支就是向一个文件写入41个字节(版本号外加一个换行符)那么简单自然速度就很快了。 Git的实现与项目复杂度无关它永远可以在几毫秒的时间内完成分支的创建和切换。这和大多数版本控制系统形成了鲜明对比。Git的分支是完全隔离的而Subversion则没有。分支本来就应该是相对独立的命名空间一个提交一般只能发生在一个分支中。在Git中其内部的对象层级依赖关系或许和SVN类似但是其工作树的视图表现形式和SVN完全不同。工作树永远是一个完整的分支不同的分支由不同的head索引去构建你不可能在工作树中同时获得多个分支的内容。Git使用的标签有两种类型轻量级的(lightweight)和含附注的(annotated)。① 轻量级标签就像是个不会变化的分支实际上它就是个指向特定提交对象的引用。② 而含附注标签实际上是存储在仓库中的一个独立对象它有自身的校验和信息包含着标签的名字电子邮件地址和日期以及标签说明标签本身也允许使用GNU Privacy Guard (GPG) 来签署或验证。Git的里程碑是只读的Git完全遵守历史不可更改这一时空法则。用户不能向git的里程碑中提交否则里程碑就不是标记而成了一个分支。当然Git允许用户删除里程碑再重新创建指定到不同历史提交。3多分支间的切换SVN中提供了一个功能switch使用switch可以在同一个工作树上在不同的分支中进行切换。Git在分支中进行切换使用的命令是checkout。七、 分支与合并Git 和 Svn 的分支实现机制完全的不同这也直接导致了 SVN 在分支合并中困难重重。尽管在 SVN 1.5 之后通过 svn:mergeinfo 属性引入了合并追踪机制但是在特定情况下合并仍会出现很多困难。1 SVN的分支合并当你在一个分支上工作数周或几个月之后主干的修改也同时在进行着两条线的开发会区别巨大当你想合并分支回主干可能因为太多冲突已经无法轻易合并你的分支和主干的修改。另一个问题Subversion不会记录任何合并操作当你提交本地修改版本库并不能判断出你是通过svn merge还是手工修改得到这些文件。所以你必须手工记录这些信息(说明合并的特定版本号或是版本号的范围)。要解决以上的问题只有通过有规律的将主干合并到分支来避免制定这样一个政策每周将上周的修改合并到分支注意这样做时需要小心你必须手工记录合并的过程以避免重复的合并你需要小心的撰写合并的日志信息精确的描述合并包括的范围。这样做看起来有点像是胁迫。SVN 的版本号是连续的版本号。每一次新的提交都会版本号1 而无论这个提交是在哪个分支中进行的。SVN一个提交可以同时修改不同分支的不同文件因为提交命令可以在 /trunk, /branches, /tags 的上一级目录执行。• SVN 的提交是单线索的每一个提交(最原始的提交0除外)都只有一个父节点(版本号小一个的提交节点)• SVN 的提交链只有一条仅从版本号和提交说明我们无法获得分支图• SVN 的分支图在某些工具(如乌龟SVN)可以提供那是需要对提交内容进行检查对目录拷贝动作视为分支对 svn:mergeinfo 的改动视为合并但这会由于目录管理的灵活性导致千奇百怪的分支图表。2Git的分支合并在 git 版本库中创建分支的成本几乎为零所以不必吝啬多创建几个分支。当第一次执行git-init时系统就会创建一个名为”master”的分支。 而其它分支则通过手工创建。下面列举一些常见的分支策略。 ① 创建一个属于自己的个人工作分支以避免对主分支 master 造成太多的干扰也方便与他人交流协作。 ② 当进行高风险的工作时创建一个试验性的分支扔掉一个烂摊子总比收拾一个烂摊子好得多。 ③ 合并别人修改的时候最好创建一个临时的分支用来合并合并完成后再“fatch”到自己的分支。Git分支相关的操作命令八、 撤消操作1提交的撤销在Subversion中一旦完成向服务器的数据提交你就没有办法再从客户端追回只能在后续的提交中修正(回退或者修改)等。因为Subversion作为集中式的版本控制不能允许个人对已提交的数据进行篡改。Subversion具有一个非常重要的特性就是它的信息从不丢失即使当你删除了文件或目录它也许从最新版本中消失了 但这个对象依然存在于历史的早期版本中。Git则不同Git是分布式版本控制系统代码库是属于个人允许任意修改。Git通过对提交建立数字摘要来保证提交的唯一性和不可更改性通过版本库在多人之间的多份拷贝来保障数据的安全性。Git可以丢弃最新的一个或几个提交使用 git reset –hard命令可以永远丢弃最新的一个或者几个提交。2提交说明的修改提交后如果对提交说明不满意如何实现对提交说明的修改⑴ Git可以使用命令git commit –amend修改提交说明。• Git可以修改最后一次提交说明并不是说不能修改历史版本的提交说明只是修改最后一个版本提交说明拥有最简单的命令• Git修改提交说明会改变提交的commit-id。即修改提交说明后将产生一个新的提交• Git可以通过git reset –hard git commit –amendgit rebase onto 等命令来实现对历史提交的修改• 使用stg工具可以更为简单的修改历史提交的提交说明包括提交内容⑵ Subversion也可以修改提交说明是通过修改提交的svn:log版本属性实现的• 不但可以修改最后一次提交的说明并且可以修改历史提交的提交说明• Subversion修改提交说明是不可逆的操作可能会造成说明被恶意修改• Subversion缺省关闭修改提交说明的功能。管理员在设置了提交说明更改的邮件通知后才可以打开该功能。3修改和重构历史提交Git可以修改和重构历史提交使用Git本身的reset以及 rebase 命令可以修改或者重整/重构历史提交非常灵活。使用强大的 stg 可以使得历史提交的重构更为简洁如果您对 stg 或者 Hg/MQ 熟悉的话。Subversion 修改历史提交只能由管理员完成。Subversion 是集中式版本控制系统从客户端一旦完成提交就没有办法从客户端撤销提交。但是管理员可以在服务器端完成提交的撤销和修改但是操作过程和代价较大。九、 权限管理Subversion通过对文件目录授权来实现权限管理子目录默认继承父目录的权限。但是也有缺憾即权限不能在分支中继承不能对单个文件授权。例如为 /trunk及其子目录的授权不能继承到分支或者标签中相应的目录下。Git 的授权做不到Subversion那样精细。Git的授权模型只能实现非零即壹式的授权要么拥有全部的写权限要么没有写权限要么拥有整个版本库的读权限要么禁用。从技术上将Git可能永远也做不到类似SVN的路径授权(读授权)• 如果允许按照路径授权则各个克隆的关系将不再是平等的关系有的内容多有的内容少分布式的理念被破坏• 如果只有部分路径可读则克隆出来的提交和原始提交的提交ID可能不同。因为提交ID是和提交内容有关的克隆中提交的部分内容被丢弃势必提交的ID也要重新计算• 允许全部代码可读只允许部分代码可写在版本控制的管理下是没有多大实际意义的而且导致了提交的逻辑上的不完整。那么有什么办法来解决授权的问题1. 公司内部代码开放。即代码在公司内部对项目组成员一视同仁的开放。2. 公司对代码库进行合理分解对每个代码库分别授权。即某个代码库对团队成员完全开放对其它团队完全封闭。3. 公司使用Subversion做集中式的版本控制个人和/或团队使用 Git-svn。这样在无法改变公司版本控制策略时程序员可以采用的变通之法。4. Git服务器的部署实际上可以使用钩子对分支和路径进行写授权即可以控制谁能够创建分支能够写特定文件。十、优缺点比较1SVN优缺点优点 1、 管理方便逻辑明确符合一般人思维习惯。 2、 易于管理集中式服务器更能保证安全性。 3、 代码一致性非常高。 4、 适合开发人数不多的项目开发。 缺点 1、 服务器压力太大数据库容量暴增。 2、 如果不能连接到服务器上基本上不可以工作看上面第二步如果服务器不能连接上就不能提交还原对比等等。 3、 不适合开源开发(开发人数非常非常多但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制)可以实现分层管理从而很好的解决开发人数众多的问题。2Git优缺点优点 1、适合分布式开发强调个体。 2、公共服务器压力和数据量都不会太大。 3、速度快、灵活。 4、任意两个开发者之间可以很容易的解决冲突。 5、离线工作。 缺点 1、学习周期相对而言比较长。 2、不符合常规思维。 3、代码保密性差一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。最后我自己是一名从事了多年开发的Java老程序员辞职目前在做自己的Java私人定制课程今年年初我花了一个月整理了一份最适合2019年学习的Java学习干货可以送给每一位喜欢Java的小伙伴想要获取的可以关注我的头条号并在后台私信我01即可免费获取。