Git基础篇(十)——Git分支管理

前言:
  强大的分支管理是Git版本管控的一大亮点,这是真正学会使用Git的关键。

1 理解分支

  说道分支管理首先要理解什么是分支。在前面的文章中我们提到过,Git会将我们提交的版本按照时间线进行串起来,然后HEAD就像指针一样会指向这些版本,整个就像数据结构中的链表一般。
  当我们创建仓库时Git会为我们创建一个名为“master”的分支,通常我们将其作为主分支。

git_branch_master.png

  就像上面这张图,每一次版本提交就是一个节点,每一个分支就像一个指向节点的指针,比如master分支就存在一个master指针指向节点,而HEAD也是一个指针,它指向master。
  如果存在多个分支,就对应多个分支指针指向节点,要分支切换操作就是将HEAD指向其他分支指针的过程。比如存在master和dev两个分支,而当分支切换到dev时,即为HEAD指向dev指针。

git_branch_dev.png

  所谓分支合并即为不同分支指针指向同一版本节点,仅在分支刚创建和合并分支时出现分支指针指向同一版本节点。当Git版本管理存在多个分支时,可以在这些分支的指针处添加新的版本节点,也即互不影响的并行开发,开发到一定阶段后再将不同分支合并到主分支,然后将其余分支删除。其余分支的分支最终都要回归到主分支。
  我们尝试创建两个分支然后将其合并,以下是示范。先在master主分支下提交一次版本c0,这时候master指针指向c0,HEAD指向master。

Test_merge_1.png

  创建并切换到dev分支,在该分支下提交c1版本,此时dev指针指向版本c1,HEAD则指向dev指针。

Test_merge_2.png

  我们再尝试切换到master分支并且在该分支下提交c2版本,此时HEAD指向master指针。

Test_merge_3.png

  在master分支下与dev分支合并。

Test_merge_4.png

  此时dev分支已经完成了它的“使命”,可以将其删除了,将dev分支删除。

Test_merge_5.png

2 分支操作

2.1 创建分支

2.1.1 git checkout -b

  Git会为我们的仓库默认创建一个名为master的主分支,若想要添加其他分支可使用指令git checkout -b <name>,比如我们创建一个名为"dev"的分支,该指令创建分支后还会自动切换到这个分支即HEAD指向新的分支。由于是在master分支下创建的dev分支,因此创建时master和dev是指向同一个节点版本的,但后续的版本提交将会是独立分别进行的。

1
git checkout -b dev

2.1.2 git branch

  也可以创建分支但不切换到新的分支,使用指令git branch <name>。比如创建dev分支,HEAD仍然保持在当前分支下不切换到新分支。

1
git branch dev

  可以git brach指令后不写分支名,则为查看当前仓库拥有的所有分支名。

1
git branch

2.1.3 git switch -c

  git switch指令是Git v2.23版本之后新增的,git switch -c <new>git checkout -b <naem>效果相同,创建及切换分支。在旧的版本中checkout既用于版本检出,也有用于分支创建和切换,新的Git新增了switch指令专用于分支切换。使用该指令创建并切换到dev分支。

1
git switch -c dev

2.2 切换分支

2.2.1 git checkout

  上面讲到的一些创建分支的指令在创建时其实也会自动切换到新的分支,但毕竟不是专用于分支切换的,我们想要在已经存在的几个分支之前切换可以使用git checkout <name>指令。比如要切换到已经存在的dev分支。

1
git checkout dev

2.2.2 git switch

  Git v2.23版本之后新增的git switch <name>指令专用于分支切换。比如切换到已经存在的dev分支。

1
git switch dev

2.3 删除分支

  使用指令git branch -d <name>删除分支,不要注意的是不能删除当前正在使用的分支,因此最少会存在一个分支。比如当前正处于master分支,我们删除dev分支。

1
git branch -d dev

2.4 合并分支

  git merge <name>指令为将某分支合并到当前分支下,分支的合并是分支操作的最终目的。分支的合并实际是将两个分支的分支差异合并,通常它是自动完成的,但也可能存在冲突,比如两个版本都同时对一个“地方”进行了分支,这样Git就不知道应该以哪个分支的改动为准,Git会将冲突留给人工去干预解决冲突。通常文件的添加和代码的新增不会冲突。比如当前处于master分支,我们要将dev分支合并到master分支。

1
git merge dev

2.5 查看分支树

  Git管理的项目可以有多个分支,而每个分支可以有多个节点,想要记清楚各个节点之间的关系是不现实的,使用git log指令可以显示当前分支所有节点提交信息及与其有关系的其他分支的节点提交信息(注意,不会显示其余分支的所有节点提交信息),但文字显示不够直观,我们可以使用git log --graph将分支之间的关系图形化显示,可以清晰的看出节点之间的关系及在哪里产生分支或在哪里合并分支。

1
git log --graph

git_log_graph.png

  --oneline参数可以简化显示的信息。

1
git log --graph --oneline

git_log_graph_oneline.png

  --all指令可以查看所有分支所有节点提交的版本信息。这也是我常用的指令。

1
git log --graph --oneline --all