Git 的分支管理

一、分支介绍

1、分支是什么

Git作为一个分布式版本控制系统,提供了强大而灵活的分支管理功能,使得开发团队能够高效地协作开发、管理不同的功能和版本。

2、为什么有分支

一般情况下主分支(master/main)应始终保持可部署的状态,避免在主分支上进行开发工作,所以需要从主分支上面新建分支,然后在这个新建分支上面进行开发,以后如果需要,可以将这个新建分支与主分支合并。

也就是说通过创建分支,开发者可以在不影响主线(通常是mastermain分支)的情况下进行新功能的开发、bug修复或实验性改动。完成后,可以将分支上的更改合并回主线。

比如说有一个仓库有 master 分支和 develop 分支,我们在 develop 分支上的操作不会影响到 master 分支。

二、分支管理

1、分支相关操作指令

1)查看分支

git branch # 查看本地分支git branch -r # 查看远程分支git branch -a # 查看所有分支(包括本地和远程分支)

以下是这些指令的使用示例:

本地的分支 master 前面有一个 *,指的是当前的工作分支是这个分支。

2)创建分支

新建一个分支并依然停留在当前分支:

git branch [new-branch] # 新建一个分支并依然停留在当前分支

使用这个指令创建一个新的分支后,在列出本地分支,发现出现了这个新建的分支,而且当前的工作分支依旧是 master。

新建一个分支并切换到这个新分支(方法一)

git checkout -b [new-branch] # 创建一个分支并切换过去

-b 是 branch 的缩写,它告诉 Git 你想要创建一个新的分支,checkout 指令作用就是切换分支。

使用这个指令后,会出现一个提示,显示已经换到了新分支上了。可以看到 * 已经在新分支上了,也就是说当前的工作分支是在这个新分支上的。

新建一个分支并切换到这个新分支(方法二)

因为 checkout 作为单个命令的功能有些超载(承担的功能有些多),所以引入了 git switch 这个指令。

git switch -c [new-branch] # 创建并切换到新分支,适用于 Git 2.23 版本及以上

在 Git 2.23 及以上版本,可以使用这个指令进行创建并切换到新分支。

-c 是 create 的缩写,表示创建一个新的分支,switch 指令作用就是切换分支。

可以看到跟上面的指令作用一致。

基于一个远程分支创建一个本地分支:

git checkout -b local-new-branch origin/remote-branch # 通过远程分支 remote-branch 分支创建一个本地新分支 local-new-branch

3)切换分支

使用 checkout 指令:

git checkout [branch] # 使用 checkout 指令切换分支

可以看到使用 checkout 指令后,当前的工作分支就改变了。

使用 switch 指令:

git switch [branch] # 使用 switch 指令切换分支

可以看到使用 switch 指令后,当前的工作分支就改变了。

4)删除分支

删除已经合并的分支:

git branch -d [branch] # 删除已经合并的分支

在删除某个分支时,需要先切换到要删除的分支以外的分支。

可以发现使用此指令可以将指定的分支删除。如果尝试删除当前工作分支 develop 的话,就会出现以下提示:

强制删除未合并的分支:

git branch -D [branch] # 强制删除未合并的分支

使用此指令也要将当前的工作分支切换到要删除分支以外的其他分支。

可以发现使用此指令可以将指定的分支强制删除。如果尝试删除当前工作分支 develop 的话,就会出现以下提示:

5)重命名当前分支

git branch -m [branch] # 重命名当前分支

使用此指令之前,你需要先切换到你想要改名的分支。

6)推送分支到远程仓库

推送分支到远程仓库(不设置跟踪):

git push origin local-branch:remote-branch # 将 local-branch 推送到 remote-branch 分支

使用此指令可以将本地分支 local-branch 分支推送到远程 remote-branch 分支,这个指令不会设置本地分支跟踪远程分支

可以看到本地的 feature 分支已经推送到远程的 feature 分支了。

这里也可以看到本地的 feature 分支没有跟踪到远程的 feature 分支,这里的指令下面会介绍。

推送分支到远程仓库并设置跟踪:

git push -u origin [branch] # 将 branch 推送到远程并设置追踪

此指令可以将分支推送到远程仓库,并将此本地分支设置跟踪到远程分支。设置了跟踪关系后,后续的操作就可以有一些简化了,直接使用 git push 自动推送当前分支到其跟踪的远程分支,直接使用 git pull 自动从跟踪的远程分支拉取更改。

这里提示 bugfix 分支已经追踪到远程的 bugfix 分支了。

然后我们可以使用以下指令来查看每个分支的跟踪情况

git branch -vv # 查看所有分支以及其跟踪状态

可以看到 bugfix 分支已经设置追踪到了远程的 bugfix 分支了。这里的 feature 分支上面一种方式推送的,并没有设置跟踪到远程分支。

我们也可以手动设置跟踪到远程分支,使用以下指令:

git branch -u origin/branch-name branch-name # 设置 branch-name 分支跟踪远程分支

这里的两个 branch-name 可以不同。这里是将本地的 branch-name 分支设置跟踪远程 branch-name 分支。

如果你想要设置当前所在分支设置跟踪到远程的某个分支,可以使用以下指令:

git branch -u origin/branch-name # 设置当前分支追踪远程指定分支

可以看到这里的本地的 feature 分支已经跟踪到远程的 feature 分支了。

7)删除远程分支

$ git push origin --delete [remote-branch] # 删除指定远程分支

此指令可以删除指定远程分支。

可以看到这里的远程 feature 分支成功被删除。

2、使用 IDEA 界面进行分支操作

1)查看分支

这里有 Local 本地分支,也有 Remote 远程分支,这里有  标志的是当前工作分支。

2)创建分支

这样操作可以直接从当前工作分支创建新分支,如果要从指定的分支创建新分支,则可以直接右键指定的分支就,然后就可以出现以下选项:

然后就可以选择从选择的分支创建新分支。

可以右键远程分支,选择 Checkout 就可以基于远程分支创建一个新的本地分支:

3)切换分支

右键想要切换的分支,就会出现选项列表,然后使用 checkout 功能就可以切换分支了。

4)删除分支

右键想要删除的分支,就会出现选项列表,然后使用删除功能就可以删除分支了。

5)重命名当前分支

右键需要改名的分支,然后就会出现重命名的选项,就可以进行重命名了。

6)推送分支到远程仓库

右键需要推送的分支就可以出现推送选项。

7)删除远程分支

右键需要删除的远程分支,就会出现删除选项。

三、分支合并

可以使用指令:

git checkout [目标分支]

切换到目标分支上,然后使用指令:

git merge [要合并到目标分支的分支]

就可以将要合并的分支合并到目标分支。

下面我们的示例将使用 IDEA 的界面操作。

1、快进合并(Fast-Forward Merge)

1)介绍

快进合并发生想要合并到的分支在分支后没有提交记录。这种情况下,Git只需将 master 分支指针向前移动到 feature 分支的位置,无需创建新的合并提交。

A---B---C (master)\D---E (feature)

在合并后:

A---B---C---D---E (master, feature)

注意:在合并后 feature 分支并不会消失。如果你不再需要 feature 分支,你可以手动将其删除。

2)示例

首先 master 分支的文件状况是这样的:

然后我们从 master 分支创建一个 feature 分支:

然后我们在 feature 分支提交一些文件:

然后我们可以发现 master 分支和 feature 分支的提交记录只有这一次不同:

这时,我们将 feature 分支合并到 master 分支:

这里我们当前分支为 master 分支,然后我们右键想要合并的分支,就会出现将 feature 分支合并入 master 分支。

合并好之后,我们可以发现主分支的提交记录与 feature 分支的提交记录是一致的了,同时在主分支中也能看到 feature 分支创建的新文件了。

2、三方合并(Three-way Merge)

1)介绍

三方合并适用于目标分支和被合并分支都有各自独立的提交,且存在一个共同的祖先节点。在这种情况下,Git 会将两个分支的最新提交与二者的最近祖先节点三者进行合并并提交。

A---B---C---D (master)\E---F (feature)

合并后:

A---B---C---D---G (master)\         /E---F---/(feature)

2)示例

最开始 master 分支的文件是这样的:

我们首先从 master 分支创建一个 feature 分支:

然后我们在 feature 上创建并提交一些文件:

然后我们切换到 master 分支,也在 master 分支提交一些文件:

然后我们分别查看 master 分支和 feature 分支的提交记录:

可以看到他们都有一个共同的祖先节点 commit 1,后面的提交是不同的,所以结构图应当是:

然后我们将 feature 分支合并到 master 分支上。

这时,我们将工作分支设为 master 分支,可以看到:

说明 feature 分支被合并到了 master 分支。

然后我们可以将工作分支设为 feature 分支,可以看到:

没有 master 分支的 Master1 的提交,因为 master 没有合并到 feature 分支。

这时的结构图应当是:

然后我们可以在 master 分支的提交记录上看到:

与我们画的结构一致。

3)补充

这里我们再看 feature 分支的提交记录是这样的:

这是因为我们是将 feature 分支合并到 master 分支上,而并没有将 master 分支合并到 feature 分支上。

而且在合并后,feature 分支依旧作为一个独立的分支存在,它不会消失,上面我们也有提到过。

3、分支合并出现冲突

1、介绍

上面我们介绍的合并都是没有冲突的,对于快进合并是不会出现冲突的,冲突会发生在三方合并中。

在合并过程中,如果同一文件的同一部分在两个分支都有不同的修改,Git无法自动决定最终的内容,此时会出现合并冲突

2、示例

最开始只有一个 master 分支,文件情况为:

然后我们创建一个 feature 分支,然后在这个分支上对 Hello.java 文件进行改动:

然后将这个文件提交:

然后我们切换到 master 分支上,也对 Hello.java 文件进行改动,但是改动与上面的改动不同:

然后将这个文件提交:

3、冲突解决

然后我们将 feature 分支合并到 master 分支,这时就会出现冲突提示:

1)手动编辑冲突文件

如果我们点击 Merge 按钮,则需要对冲突文件进行编辑,以解决冲突:

这里我们将两个类都保留:

最终解决好冲突后的合并文件就是:

保留了两个类。

补充

如果不直接通过 IDEA 提供的冲突解决编辑器,Git 也给出了冲突文件的标记:

Git 标记的规则:

<<<<<<< HEAD
当前分支(目标分支)的内容
=======
被合并分支(源分支)的内容
>>>>>>> feature

然后我们可以在这个文件中进行编辑,然后我们确定了最终要保留的文件内容后,可以直接将这个文件 add 到暂存区,然后再进行提交就完成了这次合并。

如果不解决这个冲突文件,是没法完成这次合并的,没有完成合并,则没办法切换分支。实际上也可以通过中止合并,这样这次合并就会中止,分支也能正常切换,下面会介绍中止合并。

2)使用某一分支的文件

现在是在 master 分支,如果我们选择 Accept Yours,就会以当前分支 master 的修改为最终方案进行合并,如果选择 Accept Theirs 就会以要合并的分支 feature 的修改为最终方案进行合并。

4、放弃合并

在分支合并时遇到冲突,我们可以向上面那样编辑冲突文件,解决冲突,也可以放弃合并。

可以使用指令:

git merge --abort # 中止合并

在 IDEA 中可以点击下面这里来中止合并:

5、补充

实际开发中要尽量避免出现冲突。

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

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

相关文章

Linux环境基础和基础开发工具使用

文章目录 一、yum软件管理器1、包管理器2、yum3、apt4、安装源 二、编辑器vim1、各种模式2、打开时直接让光标定位到指定号3、&#xff01;加命令字符 三、命令模式1、i 进入插入模式2、**Shift :** 进入底行模式3、光标定位4、ZZ&#xff08;大写&#xff09;保存并退出vim5、…

【java】哈希<两数之和> 理解哈希

两数之和 题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你…

【Linux】信号三部曲——产生、保存、处理

信号 1. 信号的概念2. 进程如何看待信号3. 信号的产生3.1. kill命令3.2. 终端按键3.2.1. 核心转储core dump3.2.2. OS如何知道键盘在输入数据 3.3. 系统调用3.3.1. kill3.3.2. raise3.3.3. abort 3.4. 软件条件3.4.1. SIGPIPE信号3.4.2. SIGALRM信号 3.5. 硬件异常3.5.1. 除零异…

Vue 计算属性和监听器

文章目录 一、计算属性1. 计算属性定义2. computed 比较 methods3. 计算属性完整写法 二、监听器1. 普通监听2. 添加额外配置项 一、计算属性 1. 计算属性定义 概念&#xff1a;基于现有的数据&#xff0c;计算出来的新属性&#xff0c;依赖的数据变化&#xff0c;自动重新计…

【计网】实现reactor反应堆模型 --- 框架搭建

没有一颗星&#xff0c; 会因为追求梦想而受伤&#xff0c; 当你真心渴望某样东西时&#xff0c; 整个宇宙都会来帮忙。 --- 保罗・戈埃罗 《牧羊少年奇幻之旅》--- 实现Reactor反应堆模型 1 前言2 框架搭建3 准备工作4 Reactor类的设计5 Connection连接接口6 回调方法 1 …

外包干了2年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科毕业&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

linux驱动-i2c子系统框架学习(2)

linux驱动-i2c子系统框架学习(1) 在这篇博客里面已经交代了i2c设备驱动层&#xff0c;主要的功能就是编写具体i2c的外设驱动&#xff0c;和创建设备接点给上层使用 &#xff0c;按之前学习的字符设备&#xff0c;有了设备节点&#xff0c;就可以对硬件操作了&#xff0c;在i2c…

Webserver(4.6)poll和epoll

目录 pollclient.cpoll.c epollepoll.cclient.c epoll的两种工作模式水平触发边沿触发 poll poll是对select的一个改进 select的缺点在于每次都需要将fd集合从用户态拷贝到内核态&#xff0c;开销很大。每次调用select都需要在内核遍历传递进来的所有fd&#xff0c;这个开销也…

Stable Diffusion的解读(一)

Stable Diffusion的解读&#xff08;一&#xff09; 文章目录 Stable Diffusion的解读&#xff08;一&#xff09;摘要Abstract一、机器学习部分1. Stable Diffusion的早期工作1.1 从编码器谈起1.2 第一条路线&#xff1a;VAE和DDPM1.3 第二条路线&#xff1a;VQVAE1.4 路线的交…

计算机网络——TCP篇

TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗&#xff1f; 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的&#xff1f; 一次握手:客户端发送带有 …

ROS话题通信机制理论模型的学习

话题通信是ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;中使用频率最高的一种通信模式&#xff0c;其实现模型主要基于发布/订阅模式。 一、基本概念 话题通信模型中涉及三个主要角色&#xff1a; ROS Master&#xff08;管理者&#xff0…

【Android】名不符实的Window类

1.“名不符实”的Window类 Window 是一个窗口的概念&#xff0c;是所有视图的载体&#xff0c;不管是 Activity&#xff0c;Dialog&#xff0c;还是 Toast&#xff0c;他们的视图都是附加在 Window 上面的。例如在桌面显示一个悬浮窗&#xff0c;就需要用到 Window 来实现。Wi…

后端java——如何为你的网页设置一个验证码

目录 1、工具的准备 2.基本方法 3.实现类 4.实践 HTML文件&#xff1a; Java文件1:创建验证码 Java文件2:验证验证码 本文通过HUTOOL实现&#xff1a;Hutool参考文档Hutool&#xff0c;Java工具集https://hutool.cn/docs/#/ 1、工具的准备 如果我们通过hutool来实现这个…

【go从零单排】Strings and Runes 字符串和字符

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 概念 在Go语言中&#xff0c;rune 是一个内置的数据类型&#xff0c;用于表示一个Unicode字符。它实际上是一个别名…

如何在本地Linux服务器搭建WordPress网站结合内网穿透随时随地可访问

文章目录 前言1. 安装WordPress2. 创建WordPress数据库3. 安装相对URL插件4. 安装内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 配置WordPress固定公网地址 前言 本文主要介绍如何在Linux Ubuntu系统上使用WordPress搭建一个本地网站&#xff0c…

vue data变量之间相互赋值或进行数据联动

摘要&#xff1a; 使用vue时开发会用到data中是数据是相互驱动&#xff0c;经常会想到watch,computed&#xff0c;总结一下&#xff01; 直接赋值&#xff1a; 在 data 函数中定义的变量可以直接在方法中进行赋值。 export default {data() {return {a: 1,b: 2};},methods: {u…

在 Java 中使用脚本语言

在 Java 中使用脚本语言&#xff0c;特别是在 Java 平台上集成如 Python、JavaScript 或 Ruby 等语言&#xff0c;通常可以通过 Java 的 Scripting API 来实现。这个 API 基于 JSR 223&#xff08;“Scripting for the Java Platform”&#xff09;&#xff0c;提供了一种标准方…

大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

微服务系列六:分布式事务与seata

目录 实验环境说明 前言 一、分布式事务问题与策略 1.1 分布式事务介绍 1.2 分布式事务解决策略分析 二、分布式事务解决方案 Seata 2.1 认识Seata 2.2 Seata的工作原理 2.3 部署Seata微服务 2.3.1 准备数据库表 2.3.2 准备配置文件 2.3.3 docker部署 2.4 微服务集…

Java 上机实践2(基础数据类型与数组)

&#xff08;大家好&#xff0c;今天分享的是Java的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 实验一&#xff1a;输出希腊字母表 一、实验目的 二、实验要求 三、程序代码 四、实验结果 实验二&#xff1a;…