为什么 Git 的分支操作比其他版本控制系统快?
分支允许我们偏离主要工作线,并在隔离的环境中处理其他任务。从概念上讲,我们可以将分支视为一个独立的隔离工作区。我们有一个名为 **master** 的主工作区。
我们可以创建一个特性分支,并在特性分支上单独工作,以向项目添加更多功能,而不会影响主要工作线。如果特性分支中存在某些错误,我们可以修复它,而不会影响其他协作者的工作。一旦特性分支中的所有内容都正常工作,我们可以将其与主要工作线(即 **master** 分支)合并。
上图显示有两个分支,**master** 和一个 **feature** 分支。“commit#21”是从“commit#2”派生出来的,因此 **feature** 分支包含从“commit#1”到“commit#23”的所有提交,而 master 分支包含“commit#1”、“commit#2”和“commit#3”。**master** 和 **feature** 分支可以独立工作。
分支允许我们处理不同的工作项,而不会弄乱主要工作线的代码库。我们尽可能保持主要工作线的稳定,以便我们可以随时将其发布到生产环境。如果新的开发人员加入团队,新成员可以从 **master** 中开始使用稳定的代码库。这就是分支的理念。
Git 如何以不同的方式管理分支?
如果我们使用像“subversion”这样的集中式版本控制系统 (CVCS),当创建一个新分支时,它将复制主分支中的所有内容。如果我们的代码库很大,这将导致性能瓶颈。许多人不会在 CVCS 中使用分支,因为分支速度慢且占用大量磁盘空间。
Git 分支超级快速且廉价。在 Git 中,分支只是一个指向最后一次提交的符号名称。因此,**master** 分支始终是指向主要工作线中最后一次提交的指针。当我们执行新的提交时,Git 会自动将 **master** 引用向前移动,类似于链表。
当我们创建一个新分支时,Git 将创建一个新的指针(此处为 feature),指向最后一次提交。从下图我们可以看到,**feature** 只是一个指向最后一次提交的指针。因此,Git 分支不会复制任何提交数据,它只是创建一个指针。
现在,当我们在新创建的 **feature** 分支中提交新更改时,**master** 指针将保持不变,但 feature 指针将向前移动。这在下图中显示。最初,**master** 和 **feature** 都指向“commit#3”。然后我们切换到 **feature** 分支并执行了提交“commit#4”。因此,**feature** 指针向前移动,但 **master** 分支指针保持原位。**HEAD** 指针指向当前工作分支。