Git 入门系列(三)- 分支(上)创建与切换 / 合并 / 查看 / 删除

本篇,我们说说分支,分支可是个好东西

小王正在开发 功能1,然后开发 功能 6,开发了一部分,然后测试反馈 功能 1 有问题啊,小王要 fix 功能1,可 feature6 还没完呢,完了运行不起来……

先把代码注释掉?注释后,再修改,影响到了本来的功能怎么办?一点都不智能,在 Git 版本管理中,分支(branch)就可以完美解决这个困扰。

分支是什么?
其实每次提交,Git 都会把它们串成一条时间线,到目前为止,只有一条时间线,在 Git 里这条线就是主分支,也就是 master 分支。

用分支来处理上述情境会是怎样呢

  • Step 1:在开发新功能之前先创建一个分支,比如就叫 feat_6,用来开发 功能 6
  • Step 2:在 feat_6 分支开发 新功能
  • Step 3:测试说 功能 1 有个 bug,那么可以先把开发的功能提交到 feat_6 上
  • Setp 4:切换分支到 主分支(有 功能 1 的分支),修复 bug 并提交
  • Step 5:提交完成后,可以回到 feat_6 继续开发新功能

分支的创建与切换

新建并切换, 使用git checkout -b <new_branch>

Step 1: 假设当前 master 指向 C2 (最新一次 commit ),现在在 C2 这个节点创建一个新分支 feat_6 并切换,那么新的分支也会指向 C2

创建 feat_6 分支并切换 git checkout -b feat_6


可以看到当前的分支已经从 master 切换到了 feat_6 (工作区间地址后面蓝色字标识的就是当前分支)
此时 master 和 feat_6 两个分支的内容完全一样的


扩展理解

在前面我们提到过 HEAD 比如 git reset HEAD^这个 HEAD,可以理解成 HEAD 指向当前分支,而 Git 用分支指向最新提交
当前 master 和 feat_6 都指向最新提交 C2,在 feat_6 分支上,HEAD 就指向 feat_6

Step 2~3: 继续在新分支上开发功能,在该分支功能提交后(C3),这个分支的指针也会向最新内容推进

在 feat_6 分支上新建一个 feat_6.txt, 并提交,此时 HEAD 也会指向 feat_6 分支,而 feat_6 指向最新提交。(在初始使用过程中,可以先忽略 HEAD 的概念)

为什么要先提交?
如果没有提交,修改的文件会留在工作区或者暂存区里,那么这些还没有提交的修改,会和你在即将检出(checkout)的分支产生冲突而阻止 Git 为你切换分支,所以切换分支之前最好保证当前的分支干净(工作区或暂存区里没有修改的文件)

  • 在实际操作过程中,你会发现有时工作区和暂存区存在文件,也可以成功切换,而且这些文件会一起保留到当前分支
  • 假设 在建立 feat_6 之后,在 master 分支有人修改了 test 文件,feat_6 也修改了 test 文件,此时 feat_6 没有提交,在切换分支时,就会有类似如下提示



    提示先 commit 或者 stash, commit 就是提交,stash 是 绕过 commit 方法来处理,后续学习

Step 4~5: 切换到 master 分支,来修复 功能1 的 bug,使用git checkout <branch>, 切换到 master 分支就是git checkout master(这里要和上一篇的 checkout 用法区别开)

那么此时的工作目录中你的内容就是 C2(在实例中,master 分支没有 feat_6.txt),和创建分支之前的内容是一样的,可以进行 fix,提交后,再回到 feat_6 继续开发

实际场景的推荐处理方式:

如果在实际工作中,真的遇到了 bug 需要 fix,问题严重的建议再创建一个分支来修复,待修复完成后,再合并到主分支中,以免影响到其他功能的验收

比如,创建这个分支名为 hotfix,并提交了修复的文件(C4),那分支走向如下图


创建 hotfix 分支,提交就不做逐步演示了,可以动手操作下


合并分支

不管是在 hotfix 修复问题,还是在 feat_6 开发功能,最后测试后都要合并到主分支里,项目算完整。
先回到主分支,再使用git merge命令来进行合并

git merge <branch> 合并指定分支到当前分支

git checkout master
git merge hotfix

可以看到 master 分支有了刚刚 fix 的内容(fix_feat_1.txt)
注意到上面的 Fast-forward 信息,Git 告诉我们,这次合并是“快进模式”,也就是直接把 master 指向 hotfix 的当前提交,不存在任何需要解决的分歧。


合并之后 master 分支和 hotfix 分支指向同一位置。

查看分支

随着分支的增多,可以通过 git branch查看本地分支,星号指向绿色分支是当前分支
git branch -a添加 -a 参数可以查看远程分支,远程分支会用红色表示出来

删除分支

在 完成 bug 修复之后 并且 master 也合并了 hotfix,hotfix 就可以删掉了。
使用git branch -d <branch> 执行删除操作
git branch -d hotfix (这个操作是在非 hotfix 操作的,示例中是在 master 分支,自己不能删除自己),再查看一下,hotfix 已经不在分支列表中了

本篇先到这里,后面继续介绍分支,来处理 feat_6 分支的内容,和遇到的问题。
最后回顾下知识点

  • git branch -b <new_branch>创建并切换分支
  • git branch <branch>切换分支
  • git merge <branch> 合并分支到当前分支
  • git branch 查看本地分支
  • git branch -a 查看本地和远程分支
  • git branch -d <branch>删除分支

系列文章传送门

Git 入门系列(一)- Git 概念/安装/基本操作/远程推送更新
Git 入门系列(二)- 修改管理 / 撤销操作 / 命令及区间关系
Git 入门系列(三)- 分支(上)创建与切换 / 合并 / 查看 / 删除
Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支
Git 入门系列(五)- stash 贮藏
Git 入门系列(六)- 标签 tag
Git 入门系列(七)- 可视化 Git 管理工具
Git 入门系列(八) - FAQ

欢迎关注个人公众号,【程序媛春哥的手记】


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 分支简介 Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。 当使用git commit进行提交...
    哪个鹿阅读 3,838评论 0 2
  • 一、 Git 分支简介 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分...
    常大鹏阅读 2,931评论 2 41
  • 原文推荐: A successful Git branching model 这个文章讲的是Git分支模型的原理及...
    SonyaBaby阅读 1,492评论 0 0
  • 一、基本概念: 注:对于git的分布式概念及其优点,不重复说明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大厂offer阅读 1,408评论 0 3
  • 分支的新建与合并 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。 你将经历如下...
    vb12阅读 725评论 0 0