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.xdnf.cn/news/7704.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

论文速读:简化目标检测的无源域适应-有效的自我训练策略和性能洞察(ECCV2024)

中文标题&#xff1a;简化目标检测的无源域适应&#xff1a;有效的自我训练策略和性能洞察 原文标题&#xff1a;Simplifying Source-Free Domain Adaptation for Object Detection: Effective Self-Training Strategies and Performance Insights 此篇文章为论文速读&#xff…

mac找到主目录下的文件夹

访达-&#xff08;上方状态栏显示&#xff09;-然后在

FFmpeg 4.3 音视频-多路H265监控录放C++开发十二:在屏幕上显示多路视频播放,可以有不同的分辨率,格式和帧率。

上图是在安防领域的要求&#xff0c;一般都是一个屏幕上有显示多个摄像头捕捉到的画面&#xff0c;这一节&#xff0c;我们是从文件中读取多个文件&#xff0c;显示在屏幕上。 一 改动UI文件 这里我们要添加两个label&#xff0c;为了区分我们设置一下背景色&#xff08;这个是…

RK3576 LINUX RKNN SDK 测试

安装Conda工具 安装 Miniforge Conda wget -c https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh chmod 777 Miniforge3-Linux-x86_64.sh bash Miniforge3-Linux-x86_64.shsource ~/miniforge3/bin/activate # Miniforge 安装的…

新能源行业必会基础知识-----电力现货市场理论篇-----主目录-----持续更新

新能源行业知识体系-------主目录-----持续更新https://blog.csdn.net/grd_java/article/details/140004020 这本书是2023年出版的&#xff0c;是当下了解国内电力市场最好的途径了。 电力现货市场理论篇 一、电力市场概述1. 电力市场总体架构2. 电力市场模式选择3. 电力市场建…

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功&#xff1a; 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…

#Prompt | AI | LLM # 人类如何写出LLM理解的Prompt

一、如何写好Prompt 结构化Prompt 结构化Prompt是对信息进行组织&#xff0c;使其遵循特定模式和规则&#xff0c;以便于有效理解信息。常用模块包括&#xff1a; Role: 指定角色&#xff0c;使模型聚焦于特定领域。Profile: 包括作者、版本、语言和描述。Goals: 描述Prompt的…

vue计算属性

概念&#xff1a;基于现有的数据&#xff0c;计算出来新属性。并依赖数据的变化&#xff0c;自动重新计算 使用场景&#xff1a; 语法&#xff1a;声明在computed配置项中&#xff0c;一个计算属性对应一个函数&#xff0c;使用起来和普通属性一样使用{{计算属性名}} 代码&…

playground.tensorflow神经网络可视化工具

playground.tensorflow 是一个可视化工具&#xff0c;用于帮助用户理解深度学习和神经网络的基本原理。它通过交互式界面使用户能够构建、训练和可视化简单的神经网络模型。以下是一些主要的数学模型和公式原理&#xff0c;它们在这个平台中被应用&#xff1a; 1. 线性模型 线…

Zabbix监控架构

目录 1. Zabbix监控架构-CS架构 2. Zabbix极速上手指南 主机规划 2.1 部署ngxphp环境并测试 检查安装结果 2.2 部署数据库 2.3 编译安装zabbix-server服务端及后续配置 2.4 部署前端代码代码进行访问 前端的配置文件(连接数据库与主机名等信息) 2.5 欢迎来到zabbix 2…

后台管理系统:登录页

本次项目为后台管理系统&#xff0c;在本系统内第一个页面是登录页面 登录页的各种功能介绍 作为登录页需要具有的功能有&#xff1a;点击登录时记录账户密码&#xff0c;对比账户密码的正确性&#xff0c;提示用户当前状态&#xff0c;登录完成后跳转至首页等功能。 一、网页设…

go语言解决rtsp协议只播放部分的问题(业务问题)

背景 之前不是写过一个项目嘛&#xff0c;就之前有更改过存储对接的项目 go语言对接S3存储的SDK(支持minio和OSS) 这个项目主要的业务是就一个&#xff0c;点播rtsp协议的码流&#xff0c;视频来源在存储服务器上。 这次的问题是rtsp协议只播放部分&#xff0c;需要我们进行排…

移位寄存器设计—FDRE、SRL16E及原语约束

信号处理中&#xff0c;实现数据对齐时&#xff0c;常常对单bit或多bit信号进行打拍操作&#xff0c;这个可以通过移位寄存器实现&#xff0c;SLICEM中的SRL即为移位寄存器。 这里主要记录下不同写法的效果。 1 //同步复位2 module static_multi_bit_sreg_poor #(3 parame…

Linux学习笔记之虚拟机操作

Linux简介 Linux是一种开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发得到业界认可。Linux在服务器领域可以说是最强的&#xff0c;并且具有可定制&#xff0c;可裁剪&#xff0c;适用于嵌入式领域的特点。对于linux系统&#xff0c;它最大的的特点就是一切皆…

middleware中间件概述

中间件定义 中间件&#xff08;middleware&#xff09;是基础软件的一大类&#xff0c;属于可复用软件的范畴。顾名思义&#xff0c;中间件处在操作系统、网络和数据库之上&#xff0c;应用软件的下层&#xff08;如图 15-1 所示&#xff09;​&#xff0c;也有人认为它应该属…

《清宫辞Ⅱ》开机:陈欣予旗装惊艳回归 重新演绎宫闱传奇

演员陈欣予&#xff0c;1993年11月24日出生&#xff0c;多年来在影视剧方面取得了不错的成绩&#xff0c;在演戏的道路上&#xff0c;陈欣予不断挑战自我&#xff0c;凭借对不同角色的塑造&#xff0c;收获好评无数。 11月6日&#xff0c;由北京七耀文化传媒有限公司出品制作&a…

Linux sed命令详解-结构(清楚结构便于理解记忆)-选项-模式空间与暂存区(多示例、多图)

文章目录 sed基本结构选项-n(静默模式)-e、;(多点编辑,多条命令)-f(指定脚本文件)-i(直接修改文件与备份)-E(扩展正则表达式) 常用动作p(print,打印)i(插入内容)与a(追加内容)c、y(替换)d(delete,删除)s(替换) 其他动作l(小写L,打印特殊字符)r(在匹配行后插入指定文件内容)w(将…

开箱即用!265种windows渗透工具合集--灵兔宝盒

【渗透工具箱】灵兔宝盒-Rabbit_Treasure_Box_V1.0.1 介绍 Rabbit_Treasure_Box_V1.0.1是一款Windows渗透工具箱&#xff0c;集成Dawn Launcher管理&#xff0c;便捷备份更新。内含脚本工具及在线安全工具&#xff0c;覆盖信息收集、漏洞利用、逆向破解、蓝队防御等多领域&am…

对标 Windows Copilot 的 UOS AI,升级后更能打了

进入 2024 年&#xff0c;AI 应用迎来大爆发&#xff0c;不仅各类应用纷纷宣称“AI 赋能”&#xff0c;操作系统也不例外。前有 Windows Copilot&#xff0c;后有 Apple Intelligent&#xff0c;手机行业更是积极&#xff0c;各种 AI 手机纷纷发布。国产信创系统自然也不甘落后…

【LeetCode】每日一题 2024_11_2 使两个整数相等的位更改次数(位运算/模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;使两个整数相等的位更改次数 代码与解题思路 先读题&#xff1a; 题目要我们把 n 这个数字转换成 k 这个数字&#xff0c;但是只能是二进制位 1 转换成 0 纯模拟的解法&#xff1a; f…