第七章:分支
1】分支是在软件项目中启动一条单独的开发线的基本方法。
2】分支是从一种统一的、原始的状态分离出来的,使开发能在多个方向上同时进行,
并可能产生项目的不同版本。
3】通常情况下,分支会被调解并与其他分支合并,来重聚不同的力量。
1、使用分支的原因
1】创建分支的常见理由。
2】特性分支: 指每个分支在版本库中有特定的开发目的。
3】Git 也有追踪分支的概念,或者保持一个版本库的副本同步的分支。
4】区分: 分支和标签。
第一: 标签和分支用于不同的目的。
第二: 标签是一个静态的名字。它不随着时间的推移变化。一旦应用,就不可改变。
第三: 分支是动态的,随着每次提交而移动。
第四: 可以在开发的时候作为分支名,开发结束后作为标签名。
2、分支名
1】版本库中的默认分支命名是master,在该分支保持版本库中最强大和最可靠的开发线。
2】master分支可以重命名甚至是删除,但最好别改动它。
3】为了支持可扩展性和分类组织,可以创建一个带层次的分支名。
(例如: 在bug分支下建立不同的分支,如 bug/pr-1 和 bug/pr-2)
4】分支过多,没有办法重新组织。就可以使用带层次的分支。
5】分支命名中可以做的和不可以做的。
6】分支的命名规则: 由 git check-ref-format底层命令强制检测。
3、使用分支
1】版本库可能有许多不同的分支, 但最多只有一个当前分支。
2】活动分支决定在工作目录中检出哪些文件。
3】Git不会保持分支的起源信息。分支名会随着分支上新的提交而增量地向前移动。
4】分支开始时的原始提交没有显示定义,所以该提交可以通过从分叉出的新分支的原分支名找到。
(通过 git merge-base original-branch(原分支) new-branch(新分支),查找新分支开始时的原始提交)
4、创建分支
1】Git支持复杂的分支结构,包括分支的分支和一个提交分出多个分支。
2】创建分支的命令(git branch branch [starting-commit])
第一步: 创建分支的分支。
第二步: 指定一个提交创建分支。
3】创建新分支命令,只是创建了分支。并没有将当前分支切换到新分支。
5、列出分支名
1】git branch 命令列出版本库中的分支名。(当前分支用 " * " 标记)
2】额外参数,查看远程分支。 -r 查看远程追踪分支。 -a 查看特性分支和远程追踪分支
6、查看分支
1】git show-branch命令比git branch的输出更详细,按时间递序列出一个或多个分支有贡献的提交。
2】+: 表示提交在一个分支中。 *:表示存在于活动分支的提交。 -: 表示一个合并提交。
(注意:列出分支名的 !颜色 )
3】提交存在于多个分支,每一个分支将用 + 或者 * 表示。(注意:每一个+的颜色对应上面的!)
4】遍历所有显示分支上的提交,会在它们最近的共同提交处停止。
5】git show-branch [分支名1 分支名2],可以用一组分支名限制分支历史记录的显示。
6】分支名限制,可以使用通配符。
7、检出分支
1】工作目录一次只能反映一个分支。
2】git checkout 分支名,将指定分支变成当前分支同时改变工作树文件和目录结构匹配给定分支的状态。
(1)检出分支的一个简单例子
1】改变当前分支
2】改变当前分支会对工作树文件和目录结构产生影响。有:
(2)有未提交更改时进行检出
1】当前分支如果有未提交更改,Git会拒绝检出目标分支并报错。
2】git show 分支名:文件名。 该命令可以显示 此文件在该分支的版本库中的样子。(提交之后)
3】如果修改愿意丢弃掉,可以用-f强制执行检出操作。
4】更改只暂存是无效的,如果想要修改的内容,必须提交之后再检出分支。或者是进行(贮存)
(3)合并变更到不同分支
1】工作目录的当前状态和切换的分支冲突,我们将: 工作目录中的改变和被检出的分支合并。
2】git checkout -m 分支名。-m选项:将本地修改和检出目标分支进行一次合并。如果有冲突要解决冲突。
(这个合并完全发生在工作目录中,它在任何分支上都引入合并提交)
(4)创建并检出分支
1】创建一个新分支同时切换到它,-b new-branch选项完成。
2】git checkout -b new-branch start-point
== 1、git branch new-branch start-point 2、git checkout new-branch
(5)分离HEAD分支
1】可以检出任何提交。这种情况下,Git会自动创建一中匿名分支。(称为 分离的HEAD)
2】当我们再次切换分支后,匿名分支就会消失。
8、删除分支
1】git branch -d 分支名。该命令会删除分支,注意:Git会阻止删除当前分支。
2】Git也不会允许删除一个包含不存在于当前分支提交的分支。(该分支被删除会丢失开发的提交)
3】可以通过-D选项覆盖安全检查,确定不需要该分支里的内容才可以这么做。
4】Git不会保持任何形式的关于分支名创建、移动、操纵、合并或者删除的历史记录,一旦删除就没有了。
5】Git最终始终会删除那些不再被引用的提交和不能从某些命名的引用(如分支或者标签)可达的提交。
6】如果没有对它的引用和提交,blob是不可达的。会被git gc工作当作垃圾回收。
7】git reflog命令可以恢复,意外删除的分支或者其他引用。