金融网站模版下载,家政公司网站的建设,wordpress页面使用方法,帮别人做网站开什么内容的专票转载自#xff1a;http://www.nowamagic.net/academy/detail/48160210# 在开始学习 Git 的时候#xff0c;请不要尝试把各种概念和其他版本控制系统#xff08;诸如 Subversion 和 Perforce 等#xff09;相比拟#xff0c;否则容易混淆每个操作的实际意义。Git 在保存和处…转载自http://www.nowamagic.net/academy/detail/48160210# 在开始学习 Git 的时候请不要尝试把各种概念和其他版本控制系统诸如 Subversion 和 Perforce 等相比拟否则容易混淆每个操作的实际意义。Git 在保存和处理各种信息的时候虽然操作起来的命令形式非常相近但它与其他版本控制系统的做法颇为不同。理解这些差异将有助于你准确地使用 Git 提供的各种工具。 直接记录快照而非差异比较 Git 和其他版本控制系统的主要差别在于Git 只关心文件数据的整体是否发生变化而大多数其他系统则只关心文件内容的具体差异。这类系统CVSSubversionPerforceBazaar 等等每次记录有哪些文件作了更新以及都更新了哪些行的什么内容 其他系统在每个版本中记录着各个文件的具体差异Git 并不保存这些前后变化的差异数据。实际上Git 更像是把变化的文件作快照后记录在一个微型的文件系统中。每次提交更新时它会纵览一遍所有文件的指纹信息并对文件作一快照然后保存一个指向这次快照的索引。为提高性能若文件没有变化Git 不会再次保存而只对上次保存的快照作一链接。Git 的工作方式就如下图所示。 Git 保存每次更新时的文件快照这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统但它同时还提供了许多以此为基础的超强工具而不只是一个简单的 VCS。稍后会讨论 Git 分支管理的时候我们会再看看这样的设计究竟会带来哪些好处。 近乎所有操作都是本地执行 在 Git 中的绝大多数操作都只需要访问本地文件和资源不用连网。但如果用 CVCS 的话差不多所有操作都需要连接网络。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新所以处理起来速度飞快。 举个例子如果要浏览项目的历史更新摘要Git 不用跑到外面的服务器上去取数据回来而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异Git 会取出一个月前的快照和当前文件作一次差异运算而不用请求远程服务器来做这件事或是把老版本的文件拉到本地来作比较。 用 CVCS 的话没有网络或者断开 VPN 你就无法做任何事情。但用 Git 的话就算你在飞机或者火车上都可以非常愉快地频繁提交更新等到了有网络的时候再上传到远程仓库。同样在回家的路上不用连接 VPN 你也可以继续工作。换作其他版本控制系统这么做几乎不可能抑或非常麻烦。比如 Perforce如果不连到服务器几乎什么都做不了默认无法发出命令 p4 edit file 开始编辑文件因为 Perforce 需要联网通知系统声明该文件正在被谁修订。但实际上手工修改文件权限可以绕过这个限制只是完成后还是无法提交更新。如果是 Subversion 或 CVS虽然可以编辑文件但无法提交更新因为数据库在网络上。看上去好像这些都不是什么大问题但实际体验过之后你就会惊喜地发现这其实是会带来很大不同的。 时刻保持数据完整性 在保存到 Git 之前所有数据都要进行内容的校验和checksum计算并将此结果作为数据的唯一标识和索引。换句话说不可能在你修改了文件或目录之后Git 一无所知。这项特性作为 Git 的设计哲学建在整体架构的最底层。所以如果文件在传输时变得不完整或者磁盘损坏导致文件数据缺失Git 都能立即察觉。 Git 使用 SHA-1 算法计算数据的校验和通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值作为指纹字符串。该字串由 40 个十六进制字符0-9 及 a-f组成看起来就像是 1 24b9da6552252987aa493b52f8696cd6d3b00373 Git 的工作完全依赖于这类指纹字串所以你会经常看到这样的哈希值。实际上所有保存在 Git 数据库中的东西都是用此哈希值来作索引的而不是靠文件名。 多数操作仅添加数据 常用的 Git 操作大多仅仅是把数据添加到数据库。因为任何一种不可逆的操作比如删除数据都会使回退或重现历史版本变得困难重重。在别的 VCS 中若还未提交更新就有可能丢失或者混淆一些修改的内容但在 Git 里一旦提交快照之后就完全不用担心丢失数据特别是养成定期推送到其他仓库的习惯的话。 这种高可靠性令我们的开发工作安心不少尽管去做各种试验性的尝试好了再怎样也不会弄丢数据。至于 Git 内部究竟是如何保存和恢复数据的我们会在后面讨论 Git 内部原理时再作详述。 文件的三种状态 好现在请注意接下来要讲的概念非常重要。对于任何一个文件在 Git 内都只有三种状态已提交committed已修改modified和已暂存staged。已提交表示该文件已经被安全地保存在本地数据库中了已修改表示修改了某个文件但还没有提交保存已暂存表示把已修改的文件放在下次提交时要保存的清单中。 由此我们看到 Git 管理项目时文件流转的三个工作区域Git 的工作目录暂存区域以及本地仓库。 工作目录暂存区域以及本地仓库每个项目都有一个 Git 目录如果 git clone 出来的话就是其中 .git 的目录如果 git clone --bare 的话新建的目录本身就是 Git 目录。它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要每次克隆镜像仓库的时候实际拷贝的就是这个目录里面的数据。 从项目中取出某个版本的所有文件和目录用以开始后续工作的叫做工作目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的接下来就可以在工作目录中对这些文件进行编辑。 所谓的暂存区域只不过是个简单的文件一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件不过标准说法还是叫暂存区域。 基本的 Git 工作流程如下 在工作目录中修改某些文件。 对修改后的文件进行快照然后保存到暂存区域。 提交更新将保存在暂存区域的文件快照永久转储到 Git 目录中。 所以我们可以从文件所处的位置来判断状态如果是 Git 目录中保存着的特定版本文件就属于已提交状态如果作了修改并已放入暂存区域就属于已暂存状态如果自上次取出后作了修改但还没有放到暂存区域就是已修改状态。