- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Git工作原理及使用进阶
2013-3-17 工作原理简介及使用进阶 GIT--大智若愚 Subversion、CVS、Perforce、Mercurial 等等,他们使用 “增量文件系统” (Delta Storage systems), 就是说它们存储每次提交(commit)之间的差异。 Git正好与之相反,它会把你的每次提交的文件的全部内容(snapshot)都会记录下来。这会是在使用Git时的一个很重要的理念。 GIT--大智若愚 Git的设计理念是,任何文件,只要有任何改动,哪怕是一个字节也好,都会重新创建一个副本(即之前提到的blob)对象,若一个文件被修改了4次就会有4个副本,每一个都是独立的,都与每次提交产生commit对象所管理。 乍一看Git的这种设计非常消耗硬盘,确实是这样,貌似非常愚钝!但当今的计算机时代,硬盘的低廉和容量的飞速扩大,让这磁盘空间的消耗变得越来越微不足道。Git的设计者Linus就充分利用这一点,牺牲了磁盘空间,换取了无限控制上的灵活和管理的高效。 GIT对象模型 对象 每个对象(object) 包括三个部分:类型,大小和内容。大小就是指内容的大小,内容取决于对象的类型,有四种类型的对象:blob、tree、 commit 和tag。 GIT对象模型 对象 “blob”用来存储文件数据,通常是一个文件。 “tree”有点像一个目录,它管理一些“tree”或是 “blob”(就像文件和子目录) 一个“commit”只指向一个tree,它用来标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交(commits)的指针等等。 一个“tag”是来标记某一个提交(commit) 的方法。 GIT对象模型 对象名-SHA 所有用来表示项目历史信息的文件,是通过一个40个字符的(40-digit)“对象名”来索引的,对象名看起来像这样: 6ff87c4664981e4397625791c8ea3bbb5f2279a3 GIT对象模型 对象名-SHA 这样做会有几个好处: Git只要比较对象名,就可以很快的判断两个对象是否相同。 因为在每个仓库(repository)的“对象名”的计算方法都完全一样,如果同样的内容存在两个不同的仓库中,就会存在相同的“对象名”。 Git还可以通过检查对象内容的SHA1的哈希值和“对象名”是否相同,来判断对象内容是否正确。 GIT对象模型 Blob对象 一个blob对象就是一块二进制数据,它没有指向任何东西或有任何其它属性,甚至连文件名都没有. 因为blob对象内容全部都是数据,如两个文件在一个目录树(或是一个版本仓库)中有同样的数据内容,那么它们将会共享同一个blob对象。Blob对象和其所对应的文件所在路径、文件名是否改被更改都完全没有关系。 可以使用git show命令查看内容 GIT对象模型 Tree对象 一个tree对象有一串(bunch)指向blob对象或是其它tree对象的指针,它一般用来表示内容之间的目录层次关系。 一个tree对象可以指向(reference): 一个包含文件内容的blob对象, 其它包含某个子目录内容的其它tree对象. GIT对象模型 Tree对象 Tree对象、blob对象和其它所有的对象一样,都用其内容的SHA1哈希值来命名的;只有当两个tree对象的内容完全相同(包括其所指向所有子对象)时,它的名字才会一样,反之亦然。这样就能让Git仅仅通过比较两个相关的tree对象的名字是否相同,来快速的判断其内容是否不同。 可以使用git show/git ls-tree命令查看对象的内容 GIT对象模型 Commit对象 commit对象指向一个tree对象, 并且带有相关的描述信息. 一个提交(commit)由以下的部分组成: 一个 tree对象: tree对象的SHA1签名, 代表着目录在某一时间点的内容. 父对象 (parent(s)): 提交(commit)的SHA1签名代表着当前提交前一步的项目历史. 上面的那个例子就只有一个父对象; 合并的提交(merge commits)可能会有不只一个父对象. 作者 : 做了此次修改的人的名字, 还有修改日期. 提交者(committer): 实际创建提交(commit)的人的名字, 同时也带有提交日期. TA可能会和作者不是同一个人; 例如作者写一个补丁(patch)并把它用邮件发给提交者, 由他来创建提交(commit). 注释 用来描述此次提交. 监控 Git 生成的文件 工具:Inotify inotifywait -rme modify,create,delete /test 执行下面的命令,监控Git生成的对象和其他文件 git ini
文档评论(0)