宁波模板建站哪家好,网站建设常见的问题,wordpress左侧插件,网页设计开发培训班在 Git 中提交时#xff0c;会保存一个提交(commit)对象#xff0c;该对象包含一个指向暂存内容快照的指针#xff0c;包含本次提交的作者等相关附属信息#xff0c;包含零个或多个指向该提交对象的父对象指针#xff1a;首次提交是没有直接祖先的#xff0c;普通提交有一… 在 Git 中提交时会保存一个提交(commit)对象该对象包含一个指向暂存内容快照的指针包含本次提交的作者等相关附属信息包含零个或多个指向该提交对象的父对象指针首次提交是没有直接祖先的普通提交有一个祖先由两个或多个分支合并产生的提交则有多个祖先。为直观起见我们假设在工作目录中有三个文件准备将它们暂存后提交。暂存操作会对每一个文件计算校验和(即第一章中提到的 SHA-1 哈希字串)然后把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 类型的对象存储这些快照)并将校验和加入暂存区域$ git add README test.rb LICENSE $ git commit -m initial commit of my project当使用 git commit 新建一个提交对象前Git 会先计算每一个子目录(本例中就是项目根目录)的校验和然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象除了包含相关提交信息以外还包含着指向这个树对象(项目根目录)的指针如此它就可以在将来需要的时候重现此次快照的内容了。现在Git 仓库中有五个对象三个表示文件快照内容的 blob 对象一个记录着目录树内容及其中各个文件对应 blob 对象索引的 tree 对象以及一个包含指向 tree 对象(根目录)的索引和其他提交信息元数据的 commit 对象。作些修改后再次提交那么这次的提交对象会包含一个指向上次提交对象的指针(译注即下图中的 parent 对象)。两次提交后仓库历史会变成下图样子现在来谈分支。Git 中的分支其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后你其实已经有了一个指向最后一次提交对象的 master 分支它在每次提交的时候都会自动向前移动。那么Git 又是如何创建一个新的分支的呢答案很简单创建一个新的分支指针。比如新建一个 testing 分支可以使用 git branch 命令$ git branch testing这会在当前 commit 对象上新建一个分支指针。那么Git 是如何知道你当前在哪个分支上工作的呢其实答案也很简单它保存着一个名为 HEAD 的特别指针。请注意它和你熟知的许多其他版本控制系统(比如 Subversion 或 CVS)里的 HEAD 概念大不相同。在 Git 中它是一个指向你正在工作中的本地分支的指针(译注将 HEAD 想象为当前分支的别名。)。运行 git branch 命令仅仅是建立了一个新的分支但不会自动切换到这个分支中去所以在这个例子中我们依然还在 master 分支里工作。要切换到其他分支可以执行 git checkout 命令。我们现在转换到新建的 testing 分支$ git checkout testing这样 HEAD 就指向了 testing 分支。这样的实现方式会给我们带来什么好处呢好吧现在不妨再提交一次$ vim test.rb $ git commit -a -m made a change展示了提交后的结果。非常有趣现在 testing 分支向前移动了一格而 master 分支仍然指向原先 git checkout 时所在的 commit 对象。现在我们回到 master 分支看看$ git checkout master显示了结果。HEAD 在一次 checkout 之后移动到了另一个分支这条命令做了两件事。它把 HEAD 指针移回到 master 分支并把工作目录中的文件换成了 master 分支所指向的快照内容。也就是说现在开始所做的改动将始于本项目中一个较老的版本。它的主要作用是将 testing 分支里作出的修改暂时取消这样你就可以向另一个方向进行开发。我们作些修改后再次提交$ vim test.rb $ git commit -a -m made other changes现在我们的项目提交历史产生了分叉(如图 3-9 所示)因为刚才我们创建了一个分支转换到其中进行了一些工作然后又回到原来的主分支进行了另外一些工作。这些改变分别孤立在不同的分支里我们可以在不同分支里反复切换并在时机成熟时把它们合并到一起。而所有这些工作仅仅需要 branch 和 checkout 这两条命令就可以完成。由于 Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件所以创建和销毁一个分支就变得非常廉价。说白了新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单当然也就很快了。这和大多数版本控制系统形成了鲜明对比它们管理分支大多采取备份所有项目文件到特定目录的方式所以根据项目文件数量和大小不同可能花费的时间也会有相当大的差别快则几秒慢则数分钟。而 Git 的实现与项目复杂度无关它永远可以在几毫秒的时间内完成分支的创建和切换。同时因为每次提交时都记录了祖先信息(译注即 parent 对象)将来要合并分支时寻找恰当的合并基础(译注即共同祖先)的工作其实已经自然而然地摆在那里了所以实现起来非常容易。Git 鼓励开发者频繁使用分支正是因为有着这些特性作保障。