大家好,我是若川。持续组织了近一年的源码共读活动,感兴趣的可以 点此加我微信ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。

关于命令行工具,强烈推荐我之前的文章》》》使用 ohmyzsh 打造 windows、ubuntu、mac 系统高效终端命令行工具。用过的都说非常好用。


Git的杀手锏是带来了轻量级分支,如果你使用svn分支,就会被Git新建分支和切换分支时的速度所震惊。

操作分支在Git中非常高频,学好分支操作是学好Git的基础,但在实际工作中,我发现很多同学并不熟悉Git的分支操作,本文试图通过图解的方式,讲解常用分支操作命令,和命令背后的Git分支模型。

主分支

在Git中新建一个项目后,默认有一个分支,即主分支。主分支一般表示项目的稳定版本,主分支应该包含稳定没有 Bug 的代码,并保持随时可以发布的状态,对于小型项目来说,只有一个主分支就够用了,每次我们提交都会创建一个commit节点。

$ git commit -m "c1"$ git commit -m "c2"$ git commit -m "c3"

上面的命令会创建三个commit节点,此时master分支如下图所示:

主分支上应该只包合并提交,所有的迭代应该都在分支上进行,如果是简单的改动,直接在主分支修改也是可以的,如果功能较复杂,且需要多次提交,不建议在主分支直接修改。

功能分支

当有新的功能要开发时,应该新建一个功能分支,命令如下:

$ git checkout -b feature/a

接下来在分支上创建两个提交,命令如下:

$ git commit -m "c4"$ git commit -m "c5"

此时提交树如下图所示:

当功能分支开发完成后,需要合并回主分支,合并回主分支有两种选择,快速合并和非快速合并,二者的区别在于是否创建提交节点,命令如下:

$ git merge feature/a # 快速合并
$ git merge --no-ff feature/a # 非快速合并

快速合并的结果,会直接将 master 指向了 feature/a,如下图所示:

非快速合并的结果,会在 master 创建合并提交节点,如下图所示:

两种合并方式都可以,如果选择快速合并,需要保证每个提交都是独立且完整的,如果不满足要求,Git 支持修改提交历史,需要修改后再次合并。

修改历史可以使用 rebase 命令,下面的命令可以修改最近三个提交,将第二个提交的 pick 改为 squash,可以合并第一个和第二个提交,将第三个提交的 pick 改为 edit,可以修改第三个提交的提交信息。

$ git rebase -i HEAD~3pick d24b753 feat: update ci
squash f56ef2f feat: up ci
edit 6c91961 feat: up# Rebase 50ece5c..6c91961 onto 50ece5c (3 commands)
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit

在创建当前分支之后,主分支可能又有新的提交,如下图所示:

在合并之前,建议先将主分支新的提交合并到当前分支,有两种策略可以选择,合并和变基,合并操作更简单,变基操作提交树更清晰,建议使用变基的方式。

先来看下合并操作的过程,命令如下:

$ git merge master
$ git checkout master
$ git merge feature/a

合并操作后的提交树如下图所示:

变基会修改feature/a的历史,就像 feature/a 是在 master 之后开发的一样,变基命令如下:

$ git rebase master
$ git checkout master
$ git merge feature/a

变基操作后的提交树如下图所示,虚线的提交是feature/a变基之前的状态,在变基后,虚线的提交不再有分支指向,但并不会删除,而是变成Git中的游离节点,在Git执行GC(垃圾清理)操作后,节点才会彻底删除。

故障分支

如果发现存在 Bug,要尽快修复,此时可以基于主分支新建故障分支,命令如下:

$ git checkout -b bugfix/b

当验证没问题后,故障分支需要合并回主分支,并在主分支上发布新的补丁版本,命令如下:

$ git checkout master
$ git merge --no-ff bugfix/b# 测试 构建 打标签 发布到npm

主分支更新后,下游的公共分支要及时同步变更,建议使用变基进行同步,命令如下:

$ git checkout feature/a
$ git rebase master

故障分支模型如下图所示,bugfix/b 分支合并到 master 后,feature/a 分支进行了变基操作。

标签与历史

每次发布新版本时都要打标签,版本号需要符合第四章介绍的语义化版本规范,一般功能分支发布次版本号,故障分支发布修订版本号,使用Git添加tag的命令如下所示:

# 假设当前版本是 1.1.0
$ git tag 1.1.1 # 修改次版本号
$ git tag 1.2.0 # 修改主版本

Git 的版本号,还可以添加 v 前缀,两种风格都可以,建议在一个项目里面保持统一,添加v前缀的版本示例如下:

# 假设当前版本是 v1.1.0
$ git tag v1.1.1 *# 修改次版本号
$ git tag v1.2.0 *# 修改主版本号

添加标签后,提交树示例如下图所示。

现在假设最新版本是 v1.2.0 了,突然用户反馈了 v1.0.0 版本存在 bug,如果是比较小的问题,一般我们会建议用户升级到最新版本 ,但如果用户不能升级怎么办,比如 1.x 到 2.x 存在大版本变化。

出于各种原因,存在需要维护历史版本的需求,对于还有用户使用需求的历史版本,需要提供 bug 修复的支持。

此时创建的标签就起作用了,可以基于标签新建一个版本分支,并在版本分支上修复 bug,且发布新的版本,历史版本分支,不需要再次合并回主干分支,创建标签分支的示例如下:

$ git checkout -b v1.0.x v1.0.0

此时历史分支的示例如下图所示。

总结

本文介绍了Git常见的分支命令和分支模型,希望能够帮助大家更好的掌握Git原理,如果你觉得本文对你有帮助,那就点赞加关注作者吧,如果对本文有任何疑问,欢迎在评论区交流。


················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经坚持写了8年,点击查看年度总结。
同时,最近组织了源码共读活动,帮助4000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

扫码加我微信 ruochuan12、拉你进源码共读

今日话题

目前建有江西|湖南|湖北 籍 前端群,想进群的可以加我微信 ruochuan12 进群。分享、收藏、点赞、在看我的文章就是对我最大的支持

图解Git分支和命令相关推荐

  1. 【Git分支开发命令大全】

    按步骤使用 1.本地分支代码提交 2.更新master代码 3.分支合并master 4.master合并分支 5.master代码提交 1.本地分支代码提交 示例分支名:feature_dev gi ...

  2. Redis和Git的常见命令

    Redis和Git的常见命令 key命令 String类型命令 list类型命令 set 类型命令 hash 类型命令 zset类型命令 Git 常 使 用 的 命 令 Git 分支常见命令 Gith ...

  3. 【git分支及处理冲突的方法】

    文章目录 git分支概述 git分支常用命令 git branch 分支名 git branch -v git checkout 分支名 git merge 分支名 基于码云模拟开发环境中处理冲突 总 ...

  4. 图解 Git 工作原理和常用命令使用教程

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 marklodato.github.io/visual-git-guide/in ...

  5. 【Git】Git 分支管理 ( 使用 git cherry-pick 命令提取提交记录应用于当前分支 | 创建新分支应用某个提交 | git cherry-pick 冲突处理 )

    文章目录 一.环境准备 二.创建新分支应用 dev2 提交 三.git cherry-pick 冲突处理 一.环境准备 git cherry-pick 命令的作用是 将指定的 一个或若干个 提交记录 ...

  6. 1git命令的使用,查看git仓库状态,添加文件到git跟踪,git提交,查看git分支,查看git仓库日志信息,切换git分支,解决git分支合并后出现冲突的问题

    1新建一个存储git的文件夹,命令是: toto@toto-K45VD:~$ mkdir gitfolder 2初始化一个git仓库,命令是: toto@toto-K45VD:~$cd gitfold ...

  7. Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突...

    Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下G ...

  8. Git分支创建、合并、上传等命令

    Git分支创建.合并.上传等命令 一. 创建test分支提交步骤 1.列出所有分支 git branch -a 2.创建test分支 git branch test 3.切换到test分支: git ...

  9. Git 的安装、使用、分支、命令 一篇博客全都学会

    目录 1 版本控制 1.1 什么是版本控制 1.2 为什么需要版本控制 2 Git概述 2.1 Git的工作机制 2.2 分布式版本控制工具与集中式的区别 2.3 Git是如何诞生的 3 Git的安装 ...

最新文章

  1. python文档生成工具 sphinx 简介
  2. linux下内存测试mbw,【转帖】MBW内存测试
  3. SQL Server加密存储过程的破解
  4. php生成appid,PHP生成腾讯云COS签名
  5. word20161206
  6. 安装pytest时遇到的问题及解决方案
  7. 怎样png转jpg还可以保持原有大小?
  8. 关于华为产品生命周期
  9. h5跳转到 苹果 ios app store 应用商店 的APP详情页面
  10. .Net程序员的职业规划
  11. 国家也补贴?有华为认证证书的你,就能拿它(附详细操作)
  12. 实验吧 WEB 猫抓老鼠
  13. python实现标号法确定最短路径
  14. Excel数据透视表笔记
  15. win7系统打开计算机怎么不显示磁盘分区,大师详解win7系统隐藏磁盘分区不显示的具体步骤...
  16. th_TH是什么意思?
  17. arm汇编指令详细整理及实例详解
  18. Android 获取手机第三方应用列表
  19. Java前端,悬浮窗口html+js
  20. Android 百度在线语音识别

热门文章

  1. 企业如何利用自动化设备管理软件做好商机管理?
  2. apollo学习之---(20)canbus学习
  3. select 触发click点击事件
  4. Spark MLlib机器学习 | 算法综合实战(一)(史上最详细)
  5. PLSQL导出数据空表设置
  6. 如何使用OpenCV RTMP直播推流
  7. 【C语言】C语言外部变量和内部变量
  8. android Studio 下载问题
  9. 安装web服务器组件,在Windows2003系统中如何安装Web服务器组件?
  10. 15个简易高效的代码段