【DevOps】Git 图文详解(六):Git 利器 - 分支

Git 利器 - 分支

  • 1.分支 Branch
  • 2.分支指令 🔥
  • 3.分支的切换 checkout
  • 4.合并 merge & 冲突
    • 4.1 🔸 快速合并(Fast forward)
    • 4.2 🔸 普通合并
    • 4.3 处理冲突 <<<<<<< HEAD
  • 5.变基 rebase

分支是从主线分离出去的 “副本”,分支就像是平行宇宙,可独立发展,独立编辑、提交,也可以和其他分支合并。分支是 Git 的核心必杀利器之一,分支创建、切换、删除都非常快,它非常的轻量。所以,早建分支!多用分支!

在这里插入图片描述

1.分支 Branch

比如有一个项目团队,准备 10 月份发布新版本,要新开发一堆黑科技功能,占领市场。你和小伙伴 “小美” 一起负责开发一个新功能 A,开发周期 2 周,在这两周你们的代码不能影响其他人,不影响主分支。这个时候就可以为这个新功能创建一个分支,你们两在这个分支上干活,2 周后代码开发完了、测试通过,就可以合并进要发版的开发分支了。安全、高效,不影响其他人工作,完美!

在这里插入图片描述
在实际项目中,一般会建几个主线分支。

  • 🔸 master:作为主分支,存放稳定的代码,就是开发后测试通过的代码,不允许随便修改和合并。
  • 🔸 开发分支:用于团队日常开发用,比如团队计划 10 月份开发 10 个功能并发版,则在此分支上进行,不影响主分支的稳定。
  • 🔸 功能 A 分支:开发人员根据自己的需要,可以创建一些临时分支用于特定功能的开发,开发完毕后再合并到开发分支,并删除该分支。

分支就是指向某一个提交记录的 “指针” 引用,因此创建分支是非常快的,不管仓库多大。当我们运行 git branch dev 创建了一个名字为 dev 的分支,Git 实际上是在 .git\refs\heads 下创建一个 dev 的引用文件(没有扩展名)。

$ git branch dev
$ cat .git/refs/heads/dev
ca88989e7c286fb4ba56785c2cd8727ea1a07b97

2.分支指令 🔥

指令
描述
git branch列出所有本地分支,加参数 -v 显示详细列表,下同
git branch -r列出所有远程分支
git branch -a列出所有本地分支和远程分支,用不同颜色区分
git branch [branch-name]新建一个分支,但依然停留在当前分支
git branch -d dev删除 dev 分支,-D(大写)强制删除
git checkout -b dev从当前分支创建并切换到 dev 分支
git checkout -b feature1 dev从本地 dev 分支代码创建一个 feature1 分支,并切换到新分支
git branch [branch] [commit]新建一个分支,指向指定 commit id
git branch --track [branch] [remote-branch]新建一个分支,与指定的远程分支建立关联
git checkout -b hotfix remote hotfix从远端 remotehotfix 分支创建本地 hotfix 分支
git branch --set-upstream [branch] [remote-branch]在现有分支与指定的远程分支之间建立跟踪关联:
git branch --set-upstream hotfix remote/hotfix
git checkout [branch-name]切换到指定分支,并更新工作区
git checkout .撤销工作区的(未暂存)修改,把暂存区恢复到工作区
git checkout HEAD .撤销工作区、暂存区的修改,用 HEAD 指向的当前分支最新版本替换
git merge [branch]合并指定分支到当前分支
git merge --no-ff dev合并 dev 分支到当前分支,参数 -‌-no-ff 禁用快速合并模式
git push origin --delete [branch-name]删除远程分支
git rebase master将当前分支变基合并到 master 分支
switch:新的分支切换指令切换功能和 checkout 一样,switch 只单纯的用于切换
git switch master切换到已有的 master 分支
git switch -c dev创建并切换到新的 dev 分支

📢 关于 checkout 指令:checkout 是 Git 的底层指令,比较常用,也比较危险,它会重写工作区。支持的功能比较多,能撤销修改,能切换分支,这也导致了这个指令比较复杂。在 Git 2.23 版本以后,增加了 git switchgit reset 指令。

  • git switch:专门用来实现分支切换。
  • git reset:专门用来实现本地修改的撤销,更多可参考后续 “reset” 内容。
$ git branchdev
* main
# 列出了当前的所有分支,星号“*”开头的“main”为当前活动分支。

3.分支的切换 checkout

代码仓库可以有多个分支,master 为默认的主分支,但只有一个分支在工作状态。所以要操作不同分支,需要切换到该分支,HEAD 就是指向当前正在活动的分支。

在这里插入图片描述

# 切换到dev分支,HEAD指向了dev
# 此处 switch 作用同 checkout,switch只用于切换,不像checkout功能很多
$ git switch dev
Switched to branch 'dev'
$ cat .git/HEAD
ref: refs/heads/dev

使用 git checkout dev 切换分支时,干了两件事:

  • HEAD 指向 dev:修改 HEAD 的 “指针” 引用,指向 dev 分支。
  • ② 还原工作空间:把 dev 分支内容还原到工作空间。

此时的活动分支就是 dev 了,后续的提交就会更新到 dev 分支了。

❓ 切换时还没提交的代码怎么办?

  • 如果修改(包括未暂存、已暂存)和待切换的分支没有冲突,则切换成功,且未提交修改会一起带过去,所以要注意!
  • 如果有冲突,则会报错,提示先提交或隐藏,关于隐藏可查看后续章节内容 “stash”。

4.合并 merge & 冲突

把两个分支的修改内容合并到一起,常用的合并指令 git merge [branch],将分支 [branch] 合并到当前分支。根据要合并的内容的不同,具体合并过程就会有多种情况。

在这里插入图片描述

4.1 🔸 快速合并(Fast forward)

如下图,master 分支没有任何提交,git merge dev 合并分支 devmaster,此时合并速度就非常快,直接移动 master 的 “指针” 引用到 dev 即可。这就是快速合并(Fast forward),不会产生新的提交。

在这里插入图片描述
合并 devmaster,注意要先切换到 master 分支,然后执行 git merge dev,把 dev 合并到当前分支。

📢 强制不用快速合并:git merge --no-ff -m “merge with no-ff” dev,参数 -‌-no-ff 不启用快速合并,会产生一个新的合并提交记录。

4.2 🔸 普通合并

如果 master 有变更,存在分支交叉,则会把两边的变更合并成一个提交。

  • 如果两边变更的文件不同,没有什么冲突,就自动合并了。
  • 如果有修改同一个文件,则会存在冲突,到底该采用哪边的,程序无法判断,就换产生冲突。冲突内容需要人工修改后再重新提交,才能完成最终的合并。

在这里插入图片描述
上图中,创建 dev 分支后,两个分支都有修改提交,因此两个分支就不在一条顺序线上了,此时合并 devmaster 就得把他们的修改进行合并操作了。

  • v5v7 共同祖先是 v4,从这里开始分叉。
  • Git 会用两个分支的末端 v6v8 以及它们的共同祖先 v4 进行三方合并计算。合并之后会生成一个新(和并)提交 v9
  • 合并提交 v9 就有两个祖先 v6v8

4.3 处理冲突 <<<<<<< HEAD

在有冲突的文件中,<<<<<<< HEAD 开头的内容就表示是有冲突的部分,需要人工处理,可以借助一些第三方的对比工具。人工处理完毕后,完成合并提交,才最终完成此次合并。======= 分割线上方是当前分支的内容,下方是被合并分支的变更内容。

在这里插入图片描述

5.变基 rebase

把两个分支的修改内容合并到一起的办法有两种:mergerebase,作用都是一样的,区别是 rebase 的提交历史更简洁,干掉了分叉,merge 的提交历史更完整。

在这里插入图片描述

  • dev 上执行 git rebase master 变基,将 dev 分支上分叉的 v7v8 生成补丁,然后在 master 分支上应用补丁,产生新的 v7’v8’ 新的提交。
  • 然后回到 master 分支,完成合并 git merge dev,此时的合并就是快速合并了。
  • 最终的提交记录就没有分叉了。
$ git rebase master
$ git checkout master
$ git merge dev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux rsyslog综合实战2

本次我们通过rsyslog服务将A节点服务器上的两个(E.g:多个日志也可以)日志(Path:/var/log/245-1.log、245-2.log)实时同步到B节点服务器目录下(Path:/opt/rsyslog/245) 1.rsyslog架构 2.环境信息 环境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.245CentOS…

2023 最新 PDF.js 在 Vue3 中的使用(长期更新)

因为自己写业务要定制各种 pdf 预览情况&#xff08;可能&#xff09;&#xff0c;所以采用了 pdf.js 而不是各种第三方封装库&#xff0c;主要还是为了更好的自由度。 一、PDF.js 介绍 官方地址 中文文档 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区…

基于51单片机音乐盒LCD1602显示( proteus仿真+程序+原理图+设计报告+讲解视频)

基于51单片机音乐盒LCD1602显示( proteus仿真程序原理图设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0065 音乐盒 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真…

【Qt6】字符串std::string转成Qt6的字符串QString,并输出日志

【Qt6】字符串std::string转成Qt6的字符串QString&#xff0c;并输出日志&#xff1a; std::string m_name;QString qStrName QString::fromLocal8Bit(m_name);qDebug("name %s", qPrintable(dataSourceID)); 【注意】&#xff1a; 需要用QString::fromLocal8Bit()…

Polygon Miden VM架构总览

1. 计算类型 Programs程序有2种类型&#xff1a; 1&#xff09;Circuit电路&#xff1a;即&#xff0c;程序即电路。将程序转换为电路。2&#xff09;Virtual machine虚拟机&#xff1a;即&#xff0c;程序为电路的输入。【Miden VM属于此类型】 2. 何为ZK virtual machine…

探索 Material 3:全新设计系统和组件库的介绍

探索 Material 3&#xff1a;全新设计系统和组件库的介绍 一、Material 3 简介1.1 Material 3 的改进和更新1.2 Material 3 的优势特点 二、Material 3 主题使用2.1 使用 Material3 主题2.2 使用 Material3 主题颜色 三、Material 3 组件使用3.1 MaterialButton&#xff1a;支持…

15 Go的并发

概述 在上一节的内容中&#xff0c;我们介绍了Go的类型转换&#xff0c;包括&#xff1a;断言类型转换、显式类型转换、隐式类型转换、strconv包等。在本节中&#xff0c;我们将介绍Go的并发。Go语言以其强大的并发模型而闻名&#xff0c;其并发特性主要通过以下几个元素来实现…

微机原理_15

一、单项选择题&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案。 以下叙述正确的&#xff08;&#xff09; A.微机的字长可以是8、16、24、32位 B.微机的字长可以是8、16、32、64位 C.微…

实验(四):指令部件实验

一、实验内容与目的 实验要求&#xff1a; 利用CP226实验仪上的小键盘将程序输入主存储器EM&#xff0c;通过指令的执行实现微程序控制器的程序控制。 实验目的&#xff1a; 1.掌握模型机的操作码测试过程&#xff1b; 2.掌握模型机微程序控制器的基本结构以及程序控制的基本原…

界面控件DevExpress WPF流程图组件,完美复制Visio UI!(一)

DevExpress WPF Diagram&#xff08;流程图&#xff09;控件帮助用户完美复制Microsoft Visio UI&#xff0c;并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至…

pytorch中.to(device) 和.cuda()的区别

在PyTorch中&#xff0c;使用GPU加速可以显著提高模型的训练速度。在将数据传递给GPU之前&#xff0c;需要将其转换为GPU可用的格式。 函数原型如下&#xff1a; def cuda(self: T, device: Optional[Union[int, device]] None) -> T:return self._apply(lambda t: t.cuda…

-bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory

文章目录 场景解决 场景 jenkins 发布失败, 报错ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [126]], 这说明远程服务器的deploy.sh执行失败, 首先检查权限&#xff0c;没有发现问题&#xff0c;然后手动执行一遍又报错"-ba…

steamui.dll找不到指定模块,要怎么修复steamui.dll文件

当我们使用Steam进行游戏时&#xff0c;有时可能会面对一些令人无奈的技术问题。一种常见的问题是“找不到指定模块steamui.dll”&#xff0c;这可能是由于缺少文件、文件损坏或软件冲突等原因导致。但别担心&#xff0c;这篇文章将提供几种解决此问题的方法&#xff0c;并针对…

Apache Airflow (十三) :Airflow分布式集群搭建及使用-原因及

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

线程池[重点]

线程池概述 线程池就是一个可以复用线程的技术。 不使用线程池的问题 &#xff1a;如果用户每发起一个请求&#xff0c;后台就创建一个新线程来处理&#xff0c;下次新任务来了又要创建新线程&#xff0c;而创建新线程的开销是很大的&#xff0c;这样会严重影响系统的性能。 …

第六年到第十年是分水岭

我今年懈怠了&#xff0c;觉得就这样了&#xff0c;看到知乎上有个大神的帖子&#xff0c;深受触动&#xff0c;前五年都差不多&#xff0c;第六年到第十年才是分水岭&#xff0c;是否愿意继续努力&#xff0c;才是关键。拷贝如下&#xff1a; 作者&#xff1a;技术王 来源&…

身为程序员哪一个瞬间让你最奔溃 ?

身为程序员&#xff0c;有时候最让我感到沮丧的瞬间之一是遇到难以追踪和解决的 Bug。这些 Bug 可能出现在我写的代码中&#xff0c;也可能是由于不可预测的外部因素引起的。其中一个让我最奔溃的瞬间是在一个大型项目中&#xff0c;我遇到了一个非常复杂的Bug&#xff0c;这个…

数据可视化加定语

自动化成果数据可视化 资产物料可视化 数据服务可视化 微服务架构的可观测性

uniapp生命周期详解

Uniapp的生命周期可以从以下三方面进行理解&#xff1a; 应用生命周期 应用生命周期是指应用程序从启动到关闭的整个过程&#xff0c;包括应用程序的启动、前后台切换、退出等。Uniapp提供了以下生命周期钩子函数&#xff1a; onLaunch&#xff1a;应用程序启动时触发&#…