介绍
每次 git commit 会产生一个提交,每个提交看作是一个节点,多个点连成一条枝干。
git 的命令中有针对单个提交的,也有针对分支操作。(之前几节介绍的命令都是针对单个提交)
当 git 库中存在多条分支时,用 git log --graph ,也可以直观的感受到分支的概念。
如果有可视话工具,如gitg,则更为直观:
图中可以看到两条分支,分支名分别是 master 和 dev_branch 。
概念
可以将分支理解为一系列提交的集合,外加一个分支名。
分支=分支名+提交集合
常用操作
差看分支
可以通过 git branch -a 查看当前库中的分支。
默认分支
在git 库中做第一个提交后,git 会自动创建一个名为 master 的分支。
创建分支
git branch branch_name 来创建新分支。例如:git branch dev_branch
然后,再通过 git branch -a 查看,可以看到两个分支。
这里要说明一下 [ 当前分支 ] 的概念,图中 master 前面带了一个 * 号,表示当前处在 master 分支上,也意味着后续 git commit 创建的提交(节点)都是在这个分支上的。可以做两个提交实验一下:
先通过 git log 命令,可以观察到,当前两个分支上都只有一个提交,也就是git库中唯一的一个提交:
接下来在 当前分支,也就是 master 分支上创建两个提交:
(touch 命令创建一个文件)
再通过 git log 可以看到 master 分支上有三个提交,dev_branch 上还是只有一个提交
也可以通过 gitg 工具进行观察:
切换当前分支
使用 git checkout branch_name 进行切换当前分支的操作。
假设当前处于 master 分支,那么通过 git checkout dev_branch 可以切换当前分支:
这里需要特别说明:
之前的文章里介绍过 git checkout [commit-id] 命令,是会将当前的 [工作区,暂存区,版本库] 都切到特定的提交。
git checkout [branch_name] 是和 git checkout [commit-id] 完全等价的,也会将当前的 [工作区,暂存区,版本库] 都切到分支名对应的那个的提交。
而分支名对应的提交就是分支头(分支提交链条上的最后一个提交)
因此,也可以将分支名理解成一个提交的标签(TAG),或理解成一个提交的昵称。
接下来,再在 dev_branch 上做两个新提交,这样就得到了本文开头的那张图例:
参考资料
https://git-scm.com/docs/user-manual.html#what-is-a-branch
Understanding history: What is a branch?
When we need to be precise, we will use the word "branch" to mean a line of development, and "branch head" (or just "head") to mean a reference to the most recent commit on a branch. In the example above, the branch head named "A" is a pointer to one particular commit, but we refer to the line of three commits leading up to that point as all being part of "branch A".
However, when no confusion will result, we often just use the term "branch" both for branches and for branch heads.
= google translate =
了解历史:什么是分支?
当我们需要精确时,我们将使用“branch”这个词来表示开发线,而“branch head”(或者只是“head”)则表示对分支上最近提交的引用。 在上面的示例中,名为“A”的分支头是指向一个特定提交的指针,但是我们引用导致该点的三个提交行,因为它们都是“分支A”的一部分。
但是,当不会产生混淆时,我们通常只对分支和分支头使用术语“分支”。