Git | 您所在的位置:网站首页 › freya的意思 › Git |
这一节主要是几个概念的解释:HEAD、master 以 及 Git 中非常重要的一个概念: branch。 1.引用:commit 的快捷方式首先,再看一次 log : git log
上一段里说到,图中括号里是指向这个 commit 的引用。其中这个括号里的 HEAD 是引用中特 殊的一个:它是指向当前 commit 的引用。所谓当前 commit 这个概念很简单,它指的就是 当前工作目录所对应的 commit 。 例如上图中的当前 commit 就是第一行中的那个 新的 commit 。每次当有新的 commit 的时 候,工作目录自动与新的 commit 对应;而与 此同时, HEAD 也会转而指向新的 commit 。 事实上,当使用 checkout 、 reset 等指令手动 指定改变当前 commit 的时候, HEAD 也会一起 跟过去。 总之,当前 commit 在哪里, HEAD 就在哪里, 这是一个永远自动指向当前 commit 的引用,所 以你永远可以用 HEAD 来操作当前 commit 。 3.branchHEAD 是 Git 中一个独特的引用,它是唯一的。而 除了 HEAD 之外,Git 还有一种引用,叫做 branch (分支)。 HEAD 除了可以指向 commit ,还可以指向一个 branch ,当它指向某 个 branch 的时候,会通过这个 branch 来间接 地指向某个 commit ;另外,当 HEAD 在提交时自动向前移动的时候,它会像一个拖钩一样带着它 所指向的 branch 一起移动。 例如上面的那张图里, HEAD -> master 中的 master 就是一个 branch 的名字,而它左边的 箭头 -> 表示 HEAD 正指向它(当然,也会间接 地指向它所指向的 commit )。
上面的这个 master 其实是一个特殊的branch :它是 Git 的默认 branch (俗称主 branch / 主分支)。 所谓的「默认 branch」,主要有两个特点: 新创建的 repository(仓库)是没有任何 commit 的。但在它创建第一个 commit 时,会把 master 指向它,并把 HEAD 指向 master 。 当有人使用 git clone 时,除了从远程仓 库把 .git 这个仓库目录下载到工作目录 中,还会 checkout (签出) master ( checkout 的意思就是把某个 commit 作为当前 commit ,把 HEAD移动过去,并把工作目录的文件内容替换成 这个 commit 所对应的内容)。 尽管在 Git 中,branch 只是一个指向 commit 的引用,但它有一个更通俗的理解:你还可以把一 个 branch 理解为从初始 commit 到 branch所指向的 commit 之间的所有 commit s 的一个 「串」。例如下面这张图: 所有的 branch 之间都是平等的。 branch 包含了从初始 commit 到它的所 有路径,而不是一条路径。并且,这些路径 之间也是彼此平等的。 如果你喜欢用「树枝」的概念来理解 Git 的 branch ,一定要注意上面说的这两点,否则在今 后使用 branch 的时候就可能与出现理解偏差或 者使用方式不当的问题。事实上我本人并不喜欢用 这种方式来理解 branch ,因为觉得它有点舍近求 远的味道:我为了「直观」地思考,给它了一个形 象的比喻,但由于它的本质含义其实更加简单,导 致我的这种比喻反而增加了思考它时的复杂度,未 免有点画蛇添足。不过这是我自己的感受,怎么理 解 branch 是个个人偏好的问题,这两种理解方 式你选一个喜欢的就好。 6.branch 的创建、切换和删除 6.1创建 branch如果你想在某处创建 branch ,只需要输入一行 git branch 名称 。例如你现在在 master 上: 你的 branch 就创建好了: 不过新建的 branch 并不会自动切换,你的 HEAD 在这时依然是指向 master 的。你需要用 checkout 来主动切换到你的新 branch 去: git checkout feature1然后 HEAD 就会指向新建的 branch 了: 在切换到新的 branch 后,再次 commit 时 HEAD 就会带着新的 branch 移动了: ... git commit
删除 branch 的方法非常简单: git branch -d 名称 。例如要删除 feature1 这个 branch: git branch -d feature1
![]() ![]() 所谓「引用」(reference),其实就是一个个的字 符串。这个字符串可以是一个 commit 的 SHA-1 码(例: c08de9a4d8771144cd23986f9f76c4ed729e69b0 ), 也可以是一个 branch (例: ref: refs/heads/feature3 )。 Git 中的 HEAD 和每一个 branch 以及其他的引 用,都是以文本文件的形式存储在本地仓库 .git 目录中,而 Git 在工作的时候,就是通过这些文本 文件的内容来判断这些所谓的「引用」是指向谁 的。 8.小结这一节介绍了 Git 中的一些「引用」: HEAD 、 master 、 branch 。这里总结一下: HEAD 是指向当前 commit 的引用,它具有 唯一性,每个仓库中只有一个 HEAD 。在每 次提交时它都会自动向前移动到新的 commit 。 branch 是一类引用。 HEAD 除了直接指向 commit ,也可以通过指向某个 branch 来 间接指向 commit 。当 HEAD 指向一个branch 时, commit 发生时, HEAD 会带 着它所指向的 branch 一起移动。master 是 Git 中的默认 branch ,它和其 它 branch 的区别在于: i. 新建的仓库中的第一个 commit 会 被 master 自动指向; ii. 在 git clone 时,会自动 checkout 出 master 。branch 的创建、切换和删除: i. 创建 branch 的方式是 git branch 名称 或 git checkout -b 名称 (创建后自动切换); ii. 切换的方式是 git checkout 名 称 ; iii. 删除的方式是 git branch -d 名 称 。 |
CopyRight 2018-2019 实验室设备网 版权所有 |