Git分支

目录​​​​​​​

一、分支是什么

二、查看、创建分⽀(git branch)

查看分支

创建分支

三、切换分支(git checkout,git checkout -b)

四、合并分支(git merge、git log查看合并情况)

五、删除分支(git branch -d [])

六、合并冲突(git log)

七、分支管理策略(Fast forward、--no--ff、git log --graph --pretty=oneline --abbrev-commit)

八、分支策略

九、bug分支(git stash、git stash list、git stash pop)

十、删除临时分支


一、分支是什么

在版本回退⾥,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即master分⽀。

再来理解一下HEAD,HEAD严格来说不是指向提交,而是指向master。

每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分⽀的线也越来越⻓,⽽ HEAD只要⼀直指向master分⽀即可指向当前分⽀。

通过查看当前的版本库,我们也能清晰的理出思路:

二、查看、创建分⽀(git branch)

Git⽀持我们查看或创建其他分⽀,在这⾥我们来创建第⼀个⾃⼰的分⽀dev,对应的命令为:

查看分支

git branch 

创建分支

git branch [分支名]

例:

当我们创建新的分⽀后,Git新建了⼀个指针叫dev,*表示当前HEAD指向的分支是master分支。

同时,通过目录结构也可以发现,新的dev分支。

发现⽬前dev和master指向同⼀个修改。并且也可以验证下HEAD⽬前是指向master的。

总结:

三、切换分支(git checkout,git checkout -b)

git checkout

可以发现HEAD已经指向了dev,就表⽰已经成功的切换到了dev上!
接下来,在dev 分⽀下修改test⽂件,新增⼀⾏内容,并进⾏⼀次提交操作:

再切换回master,查看分支

会发现新增内容不见了,此时可以看看master分支指向,发现两者指向的提交不一样:

因为在dev上进行的提交,而master分支的提交点并没有发生改变,此时的状态:

git checkout -b []创建分支并切换到新的分支上

四、合并分支(git merge、git log查看合并情况)

为了在master主分⽀上能看到新的提交,就需要将dev 分⽀合并到master 分⽀,⽰例如下:

git merge命令⽤于合并指定分⽀到当前分⽀。合并后,master就能看到dev分⽀提交的内容了。此时的状态如图所示:

Fast-forward代表“快进模式”,会直接把master指向dev的当前提交,所以合并速度⾮常快。

并不是每次合并都能Fast-forward。

五、删除分支(git branch -d [])

合并完成后,dev分⽀对于我们来说就没⽤了,那么dev分⽀就可以被删除掉,注意如果当前正处于某分⽀下,就不能删除当前分⽀,如:

因为创建、合并和删除分支非常快,所以Git鼓励使用完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

六、合并冲突(git log)

在实际分⽀合并的时候,有时候可能会遇到代码冲突的问题。

例:

现在mater和dev分支都有各自新的分支了,因为都进行了提交。(可以对比第三点和第四点进行查看)

这种情况下,Git只能试图把各⾃的修改合并起来,但这种合并就可能会有冲突,如下所⽰:

我们再来查看一下test

发现⽂件有冲突后,Git会⽤<<<<<<<,=======, >>>>>>>来标记出不同分⽀的冲突内容。

此时我们必须要⼿动调整冲突代码,并需要再次提交修正后的结果!!(再次提交很重要,切勿忘 记)

到这⾥冲突就解决完成,此时的状态变成了

git log

⽤带参数的git log也可以看到分⽀的合并情况:

最后,不要忘记dev分⽀使⽤完毕后就可以删除了:

七、分支管理策略(Fast forward、--no--ff、git log --graph --pretty=oneline --abbrev-commit)

通常合并分⽀时,Git会采⽤Fast forward 模式。采⽤ Fast forward 模式之后,形成的合并结果是? 

在这种 Fast forward 模式下,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提交到底是merge进来的还是正常提交的。

但在合并冲突部分,也能看到通过解决冲突问题,会再进⾏⼀次新的提交,得到的最终状态为:

那么这就不是 Fast forward 模式了,这样的好处是,从分⽀历史上就可以看出分⽀信息。例如现在已经删除了在合并冲突部分创建的 dev 分⽀,但依旧能看到master其实是由其他分⽀合并得到:

Git⽀持强制禁⽤ Fast forward 模式,(--no--ff)就会在merge时⽣成⼀个新的 commit ,这样, 从分⽀历史上就可以看出分⽀信息。

git merge --no-ff -m "" [分支名]

注意--no--ff,表示禁用Fast forward模式。禁用Fast forward后合并会创建一个新的commit,所以加上-m参数,把描述写进去。

合并后,查看分⽀历史:

git log --graph --pretty=oneline --abbrev-commit

可以发现,不使用Fast  forward模式merge后会像这样:

所以在合并分⽀时,加上 --no-ff 参数就可以⽤普通模式合并,合并后的历史有分⽀,能看出来曾经做过合并,⽽ fast forward 合并就看不出来曾经做过合并。

八、分支策略

在实际开发中,应该按照⼏个基本原则进⾏分⽀管理:

⚠️⾸先,master分⽀应该是⾮常稳定的,也就是仅⽤来发布新版本,平时不能在上⾯⼲活;

建议干活都在分支上进行,也就是说dev分支没有那么稳定,等稳定版本出来后,再把dev合并到master上。在实际项目中,每个人都有自己的分支,时不时往一个分支合并就行。

九、bug分支(git stash、git stash list、git stash pop)

假如现在正在dev分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有bug,需要解决。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除。

可是现在dev的代码在工作区中只进行开发了一半,还是不能提交:

可以看见checkout到master显示test修改了(modify)

Git提供了 git stash 命令,可以将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时间恢复出来。

而存储位置则是在:

多了一个stash,再看工作区就是干净的,(除⾮有没有被Git管理的⽂件),因此可以放⼼地创建分⽀来修复bug。

储藏 dev ⼯作区之后,由于我们要基于master分⽀修复bug,所以需要切回 master 分⽀,再新

建临时分⽀来修复bug,⽰例如下:

前面说git branch可以创建分支,那么这里顺带演示前面第三点所说的git checkout -b[]创建并切换到该分支

修复完成后,切换到master分⽀,并完成合并,最后删除fix_bug分⽀:

⾄此,bug的修复⼯作已经做完了,我们还要继续回到dev 分⽀进⾏开发。切换回dev 分⽀:

可以发现工作区是干净的,那么刚才的工作内容呢?(git stash list命令)

⼯作现场还在,Git把stash内容存在某个地⽅了,需要恢复⼀下,可以使
⽤git stash pop 命令,恢复的同时会把stash也删了,⽰例如下:

再次查看的时候,我们已经发现已经没有现场可以恢复了

另外,恢复现场也可以采⽤git stash apply 恢复,但是恢复后,stash内容并不删除,你需要
⽤git stash drop 来删除;
你可以多次stash,恢复的时候,先⽤git stash list 查看,然后恢复指定的stash,⽤命令
git stash apply stash@{0} 。
恢复完代码之后我们便可以继续完成开发,开发完成后便可以进⾏提交。

但我们注意到了,修复bug的内容,并没有在dev 上显⽰。此时的状态图为:

Master 分⽀⽬前最新的提交,是要领先于新建dev 时基于的master 分⽀的提交的,所以我们
在dev中看不⻅修复bug的相关代码。

我们的最终⽬的是要让 master 合并 dev分⽀的,那么正常情况下我们切回master 分⽀直接合并即可,但这样其实是有⼀定⻛险的。是因为在合并分⽀时可能会有冲突,⽽代码冲突需要我们⼿动解决(在 master 上解决)。我们⽆法保证对于冲突问题可以正确地⼀次性解决掉,因为在实际的项⽬中,代码冲突不只⼀两⾏那么简单, 有可能⼏⼗上百⾏,甚⾄更多,解决的过程中难免手误出错,导致错误的代码被合并到master上。此时的状态为:

解决这个问题的⼀个好的建议就是:最好在⾃⼰的分⽀上合并下 master ,再让 master 去合并 dev ,这样做的⽬的是有冲突可以在本地分⽀解决并进⾏测试,⽽不影响 master 。此时的状态为:

对应的实操演示如下:

首先dev合并master,会发现发生了冲突

解决冲突重新提交,再切回master,再进行合并分支,最后删除分支

十、删除临时分支

软件开发中,总有⽆穷⽆尽的新的功能要不断添加进来。 添加⼀个新功能时,不希望因为⼀些实验性质的代码,把主分⽀搞乱了,所以,每添加⼀个新功能,最好新建⼀个分⽀,我们可以将其称之为feature 分⽀,在上⾯开发,完成后,合并,最后,删除该 feature 分⽀。

可是,如果我们今天正在某个feature分⽀上开发了⼀半,被突然叫停,说是要停⽌新功能的开发。虽然⽩⼲了,但是这个feature 分⽀还是必须就地销毁,留着⽆⽤了。这时使⽤传统的 git branch -d 命令删除分⽀的⽅法是不⾏的。演⽰如下:

创建并切换到feature分支,开发新功能

提交后被叫停,准备切回主分支删除feature分支

就会发现常规方法删不了,需要使用git branch -D

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

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

相关文章

sigmoid和softmax有什么区别,softmax的本质是最大熵?

本文理论依据王木头的视频&#xff1a; softmax是为了解决归一问题凑出来的吗&#xff1f;和最大熵是什么关系&#xff1f;最大熵对机器学习为什么非常重要&#xff1f;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cP4y1t7cP/?spm_id_from333.999.0.0&vd_sourc…

stm32 挂死定位(死循环)

1&#xff0c;调式程序时先看初始化和轮询点灯流程&#xff0c;如果灯没有闪烁则表明程序进入了死循环。 2&#xff0c;程序调式进入调式debug接口&#xff1b; 3&#xff0c;打断点依次运行&#xff1b; 4&#xff0c;查看寄存器&#xff1b; LR在异常后通常为0xFFFFFFFx&am…

ZFC in Lean 之 前集及其成员关系(S, ∈)是良创的(Well-founded)

基于前文&#xff0c;对前集&#xff08;S&#xff0c;pre-set&#xff09;、其成员关系&#xff08;∈&#xff0c;membership&#xff09;&#xff0c;以及良创&#xff08;Well-Founded&#xff09;的定义&#xff0c;此文&#xff0c;分析&#xff08;S, ∈&#xff09;是良…

【暴刷力扣】59. 螺旋矩阵 II

题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 题解 leetcode 大部分题解写的不知道都是什么——代码非常杂乱。 还是直接放上紫书&#xff08;《算法竞赛入门指南》&#xff09;…

vue3+ts+element-ui实现的可编辑table表格组件 插入单行多行 组件代码可直接使用

最近需求越来越离谱&#xff0c;加班越来越严重&#xff0c;干活的牛马也越来越卑微。写了一个可编辑表格&#xff0c;并已封装好组件&#xff0c;可直接使用。 基于这位大佬的 动态表格自由编辑 方法和思路&#xff0c;于是参考和重写了表格&#xff0c;在基础上增加和删除了…

zxing生成、解析二维码,条形码

1、maven依赖 <!--zxing依赖--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupI…

JQuery设置Cookie操作,设置、获取、删除三种方法

//触发条件 当用户点击或者操作时需要设置cookie时 //方法里面定义了三个处理cookie的方法 $(document).ready(function(e) {$("#btnsetcookie").click(function() {setCookie("Demo", "我的示例Cookie数据", 2); //设置cookie});$("#btn…

bert-base-uncased使用

1.下载模型 https://github.com/google-research/bert?tabreadme-ov-file 2.下载config.json和pytorch_model.bin https://huggingface.co/google-bert/bert-base-uncased/tree/main 3.解压缩到同一文件夹 4.代码测试 from transformers import BertModel,BertTokenizerBER…

【人工智能】阿里云PAI平台DSW实例一键安装Python脚本

阿里云的DSW实例自带的镜像很少而且并不好用&#xff0c;所以我在这里写三个一键编译安装Python3.8&#xff0c;Python3.9&#xff0c;Python3.10的Shell脚本。 安装Python3.8 wget https://www.smallbamboo.cn/install_python38.sh && chmod x install_python38.sh …

每日科技资讯:2024年11月09日【龙】农历十月初九 ---文末送书

目录 1.史上最强游戏CPU&#xff01;9800X3D首发评测2.苹果喊话iPhone 13和14钉子户&#xff1a;16方方面面都升级了3.加拿大政府下令 TikTok 关闭该国业务&#xff0c;但应用仍可以继续访问4.OpenAI 刚刚花了超过 1000 万美元购买了Chat.com5.Max 加入打击密码共享行列6.微软可…

「实战应用」如何用图表控件LightningChart .NET在WPF中制作表格?(一)

LightningChart .NET完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科…

大数据学习11之Hive优化篇

1.Hive压缩 1.1概述 当前的大数据环境下&#xff0c;机器性能好&#xff0c;节点更多&#xff0c;但并不代表我们无条件直接对数据进行处理&#xff0c;在某些情况下&#xff0c;我们依旧需要对数据进行压缩处理&#xff0c;压缩处理能有效减少存储系统的字节读取数&#xff0…

【Linux】【Vim】多文件编辑与分屏

多文件编辑 编辑另一个文件文件列表分屏vimdiff文件跳转 编辑另一个文件 除了为每一个要编辑的文件运行一次 Vim 之外&#xff0c;还可以在当前 Vim 中开始编辑另一个文件。 :edit foo.txtVim 会关闭当前正在编辑的文件打开指定的新文件进行编辑。如果当前文件还有未存盘的内容…

Fastify Swagger:自动化API文档生成与展示

在现代软件开发中&#xff0c;API文档的生成和维护是一个不可或缺的环节。Fastify Swagger 是一个专为 Fastify 框架设计的插件&#xff0c;它能够自动生成符合 Swagger&#xff08;OpenAPI v2 或 v3&#xff09;规范的文档&#xff0c;从而帮助开发者轻松创建和维护API文档。本…

SQL,力扣题目262,行程和用户

一、力扣链接 LeetCode_262 二、题目描述 表&#xff1a;Trips ----------------------- | Column Name | Type | ----------------------- | id | int | | client_id | int | | driver_id | int | | city_id | int | | status …

【复旦微FM33 MCU 开发指南】ADC

前言 本系列基于复旦微FM33LC0系列单片机的DataSheet编写&#xff0c;旨在提供手册解析和开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/11/09 全文字数&#xff…

机器学习—是否有路通向AGI(通用人工智能)

AI包含两个非常不同的东西&#xff0c;一个是ANI&#xff0c;代表人工狭义智能&#xff0c;这是一个人工智能系统&#xff0c;只做一件事&#xff0c;狭隘的任务&#xff0c;可能非常有价值&#xff0c;比如智能音箱或者网络搜索或AI应用于特定应用。例如&#xff0c;过去几年的…

2.4w字 —TS入门教程

目录 1. 什么是TS 2. TS基本使用 3 TS基础语法 3.1 基础类型约束 3.11 string&#xff0c;number&#xff0c;boolean&#xff0c; null和undefined 3.12 any 3.13 unknown 3.14 void 3.15 数组 3.16 对象 3.2 函数的约束 3.21 普通写法 3.22 函数表达式 3.22 可选…

深度学习注意力机制类型总结pytorch实现代码

一、注意力机制的基本原理 在深度学习中&#xff0c;注意力机制&#xff08;Attention Mechanism&#xff09;已经成为一种重要的技术。意力机制通过动态调整模型的注意力权重&#xff0c;来突出重要信息&#xff0c;忽略不重要的信息&#xff0c;大大提高了模型的效果 注意力…

数据库SQLite的使用

SQLite是一个C语言库&#xff0c;实现了一个小型、快速、独立、高可靠性、功能齐全的SQL数据库引擎。SQLite文件格式稳定、跨平台且向后兼容。SQLite源代码属于公共领域(public-domain)&#xff0c;任何人都可以免费将其用于任何目的。源码地址&#xff1a;https://github.com/…