本节主要总结分支的基本概念与本地库分支的基本使用,对于远程分支的使用在下一个部分进行总结。同时分支也是之前很多概念的基础。理解分支的概念也有助于后面更好的使用Git。
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
分支简介
首先明确Git数据的保存方式,他是一系列不同时刻的快照,然后Git保存一个提交对象的时候,该提交对象会保存一个指向暂存内容的快照的指针。该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象
Git保存数据的方式
我们假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。暂存操作会为每一个文件计算校验和(使用我们在起步中提到的SHA-1哈希算法),然后会把当前版本的文件快照保存到Gt仓库中(Gt使用blob对象来保存它们),最终将校验和加入到暂存区域等待提交 Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 master 分支会在每次提交时自动向前移动。
分支的基本使用
创建分支
git branch <branchname> HEAD 可以表示目前所在的分支
分支的切换
使用git checkout
分支的新建与合并(案例)
背景
新建与切换分支
创建一个分支同时切换到那个分支上。git checkout -b iss53 等同于
这时候你的 HEAD 指针指向了 iss53 分支。当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。 可以说C2是一个版本了,现在需要开始新建一个分支来解决问题,于是创建一个iss53分支来解决问题。 iss53对问题进行了修改,现在突然说要修复一个紧急问题。 有了 Git 的帮助,你不必把这个紧急问题和 iss53 的修改混在一起, 你也不需要花大力气来还原关于 53# 问题的修改,然后再添加关于这个紧急问题的修改,最后将这个修改提交到线上分支。 你所要做的仅仅是切换回 master 分支。要留意你的工作目录和暂存区里那些还没有被提交的修改, 它可能会和你即将检出的分支产生冲突从而阻止 Git 切换到该分支。 新建分支,解决问题。
合并分支
你可以运行你的测试,确保你的修改是正确的,然后将 hotfix 分支合并回你的 master 分支来部署到线上。你可以使用 git merge 命令来达到上述目的:切回master,然后git merge hotfix
删除分支
git branch -d hotfix
继续工作
切回issue5分支,继续解决issue53问题
分支的合并
假设你已经修正了 #53 问题,并且打算将你的工作合并入 master 分支。 为此,你需要合并 iss53 分到master 分支,这和之前你合并 hotfix 分支所做的工作差不多。你只需要检出到你想合并入的分支,然后运行git merge 命令: 合并完成后删除分支
遇到冲突时的分支合并
有时候合并操作不会如此顺利。如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git就没法干净的合并它们。如果你对#53问题的修改和有关hotfix分支的修改都涉及到同一个文件的同一处,在合并它们的时候就会产生合并冲突:
解决冲突
冲突就是你对一个文件进行了两种不同的修改,这是和就没办法进行合并,需要自己决定需要使用或者丢弃那个文件.
解决提交
分支管理
如何查看已有分支
git branch git branch 命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表: git branch -v –merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。 如果要查看哪些分支已经合并到当前分支,可以运行 git branch --merged:
|