git 分支

news/2025/11/18 8:44:58/文章来源:https://www.cnblogs.com/tellerfuliye/p/19235631

git分支的理解 

 

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。

但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

创建与合并分支

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

真是太神奇了,你看得出来有些提交是通过分支完成的吗?

下面开始实战。

首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支:

$ git branch
* devmaster

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

create new branch dev..

然后提交:

$ git add readme.txt
$ git commit -m "create new branch...."
[dev 45ae9a9] create new branch....1 file changed, 1 insertion(+)

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating 90bc1f7..45ae9a9
Fast-forwardreadme.txt | 1 +1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev
Deleted branch dev (was 45ae9a9).

删除后,查看branch,就只剩下master分支了:

$ git branch
* master

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

小结

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

解决冲突

人生不如意之事十之八九,合并分支往往也不是一帆风顺的。

准备新的feature1分支,继续我们的新分支开发:

$ git checkout -b feature1
Switched to a new branch 'feature1'

 

修改readme.txt最后一行,改为:

create new branch feature1..

 

feature1分支上提交:

$ git add readme.txt
$ git commit -m "create new branch feature1 first modify"
[feature1 b4309b0] create new branch feature1 first modify1 file changed, 1 insertion(+)

切换到master分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.(use "git push" to publish your local commits)

Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。

master分支上把readme.txt文件的最后一行改为:

goback master....

提交:

$ git add readme.txt
$ git commit -m "goback master first modify"
[master 0b56936] goback master first modify1 file changed, 1 insertion(+)

现在,master分支和feature1分支各自都分别有新的提交,变成了这样:

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:

$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:

复制代码
复制代码
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.(use "git push" to publish your local commits)
You have unmerged paths.(fix conflicts and run "git commit")Unmerged paths:(use "git add <file>..." to mark resolution)both modified:   readme.txtno changes added to commit (use "git add" and/or "git commit -a")
复制代码
复制代码

我们可以直接查看readme.txt的内容:

复制代码
复制代码
test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
<<<<<<< HEAD
goback master....
=======
create new branch feature1..
>>>>>>> feature1
复制代码
复制代码

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

复制代码
复制代码
test git modify second
study git
three add
four add modify
five add modify
six add modify
seven add modify
eight add modify ...
create new branch dev..
create new branch feature1..
goback master....
复制代码
复制代码

再提交:

$ git add readme.txt
$ git commit -m "fixed conflicts"
[master 0f3d64a] fixed conflicts

现在,master分支和feature1分支变成了下图所示:

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

复制代码
复制代码
$ git log --graph --pretty=oneline --abbrev-commit
*   0f3d64a fixed conflicts
|\
| * b4309b0 create new branch feature1 first modify
* | 0b56936 goback master first modify
|/
* 45ae9a9 create new branch....
* 90bc1f7 test name
* c1bdf43 test commit
* dd34c9a no add but commit,because use other parameter
* 4ed30d1 eight modify dify
* b45ca96 eight modify
* 9332d40 seven modify
* 72c6f9b six modify
* f64b5a0 five modify
* de8fd65 four modify
* 83a4b1e three modify
* 01c05cf two modify
* 1acafa7 first modify
* 09c1bba first git
复制代码
复制代码

最后,删除feature1分支:

$ git branch -d feature1
Deleted branch feature1 (was b4309b0).

小结

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

git log --graph命令可以看到分支合并图。

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

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

相关文章

跨境电商ERP系统哪家好?给亚马逊卖家的深度答案:聚焦赛狐ERP

“跨境电商ERP系统哪家好?”——这或许是每一位谋求降本增效、实现精细化运营的卖家,在成长道路上必经的拷问。 面对市场上琳琅满目的选择,通用的解决方案往往意味着“什么都能做一点,但什么都不够精深”。对于业务…

kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的开源反爬虫接口防刷组件。

kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的开源反爬虫接口防刷组件。Posted on 2025-11-18 08:36 且行且思 阅读(0) 评论(0) 收藏 举报概述kk-anti-reptile 是适用于基于 spring-boot 开发的分…

P3796 AC 自动机(简单版 II)-题解

题解考虑如何计数:我们在建树的过程中记录每个模式串的结束位置 \(End_i\)。在文本串匹配时,每跑到一个结束位置,就将其对应的 \(cnt\) 加一即可。询问与统计答案:询问:不同于简单版 I,每个串每出现一次都要统计…

RustRover 2025.2.4, 11月最新版 安装、授权、使用说明

RustRover 2025.2.4, 11月最新版 安装、授权、使用说明2025-11-18亲测 支持最新版本2025.2.4 支持Windows、MAC、Linux一 安装 官网下载 : https://www.jetbrains.com/zh-cn/rust/ 根据提示安装 二 授权说明回复 《ru…

蓝牙基础(七):蓝牙协议栈的多路复用与数据调度中心 —— L2CAP(蓝牙逻辑链路控制与适配协议)

liwen01 2025.11.08 前言 我们简单分析这样的一个应用场景:一个智能手表和一副蓝牙耳机,它们通过蓝牙都连接到了一个手机上。 智能手表 需要的功能有:实时显示手机来电/消息提醒(低延迟信号传输)同步健康数据(如…

20232308 2025-2026-1 《网络与系统攻防技术》实验七实验报告

1.实验内容 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 2.实验过程 2.1简单应用SET工具建立冒名网站 SET:Social Engineering Toolkit(…

2025年评价高的双组份聚脲厂家最新推荐排行榜

2025年评价高的双组份聚脲厂家最新推荐排行榜行业背景与市场趋势双组份聚脲作为一种高性能防护材料,近年来在建筑防水、工业防腐、市政工程等领域应用日益广泛。根据中国聚脲行业协会最新发布的《2024-2025年中国聚脲…

2025年热门的钱币评级高口碑榜

2025年热门的钱币评级高口碑榜行业背景与市场趋势钱币评级行业近年来呈现出蓬勃发展的态势,据《2024年中国钱币收藏市场研究报告》显示,全球钱币评级市场规模已突破50亿美元,年复合增长率达到12.3%。中国作为全球第…

Pimcore密码验证漏洞分析:CVE-2023-5844安全风险详解

本文详细分析了Pimcore admin-ui-classic-bundle中的密码验证漏洞CVE-2023-5844,该漏洞允许用户将旧密码设置为新密码,违反了密码策略要求,存在中等严重程度的安全风险。pimcore/admin-ui-classic-bundle 未经验证的…

2025年口碑好的钱币拍卖潜力黑马榜

2025年口碑好的钱币拍卖潜力黑马榜钱币拍卖市场前景广阔近年来,随着中国经济的持续发展和居民财富的不断积累,钱币收藏市场呈现出蓬勃发展的态势。根据中国收藏家协会发布的《2023年中国钱币收藏市场报告》显示,202…

Tauri2.9+Vue3桌面版OS系统|vite7+tauri2+arcoDesign电脑端os后台模板

最新版tauri2.9+vite7.2+pinia3+arco仿macOS/wins管理系统TauriVue3OS。 vite7-tauri2-os基于最新跨平台框架tauri2.9+vite7.2.2+vue3 setup+pinia3+arco-design+echarts实战桌面客户端OS管理后台模板。内置macOS+wind…

节省 60% Token 的新数据格式「GitHub 热点速览」

我最近琐事缠身,连续好几周没发「GitHub 热点速览」了,这样不行得赶紧续上。 首先映入眼帘的是可节省 60% Token 的新数据序列化格式 TOON,其官方开源的 TypeScript 实现在 GitHub 上一周便斩获了 3.5k Star,而且热…

用JMeter查看烟台天气

一、获取万维易源接口信息 登录万维易源,进入个人中心开通天气查询相关接口。 从接口详情页获取核心信息,接口地址示例为https://route.showapi.com/9-2,个人 appKey 在我的接口中查看。 明确请求参数,必填参数包括…

万维易网在线调试天气

登录万维易网,在页面中找到天气预报,进入后点击在线调试 可在aere窗口填入所需查询的地点 点击模拟调用接口,查询成功

在前端中调用天气预报接口,并在页面中显示

在前端中设置一个输入框和一个按钮 输入框负责传入参数(城市名称参数),点击按钮后进行查询前端代码点击查看代码 **<div class="container">** ** <h2>城市天气查询</h2>** ** …

linux .gz解压命令

在 Linux 中,要解压 .gz 文件(即 Gzip 压缩文件),可以使用 gzip 命令的 gunzip 子命令。以下是常用命令: 命令示例: gunzip file.gz 说明:gunzip 是解压 .gz 文件的命令。 file.gz 是你要解压的文件名。如果文件…

linux .forward

在 Linux 系统中,.forward 是一个特殊的文件,通常用于 SSH 配置,它用于定义 SSH 服务器的转发规则。这个文件通常位于 ~/.ssh/ 目录下,用于控制 SSH 连接时的端口转发。一、.forward 文件的作用 .forward 文件用于…

linux .epub

你提到的 .epub 文件是 EPUB 格式,这是一种常见的电子书格式,用于在移动设备(如智能手机、平板)和桌面计算机上阅读电子书。EPUB 文件通常使用 .epub 作为扩展名。 一、EPUB 文件的基本信息扩展名:.epub 用途:电…

大模型语音呼叫智能体「云蝠智能」完成 A+轮数千万融资丨社区成员项目

云蝠智能现已完成了由金沙江创业投资领投的 A+ 轮融资,鞍羽资本担任独家财务顾问。作为国内第一批直接采用大模型从事智能语音客服的企业,云蝠智能其全栈自研的「神鹤大模型」支撑着语音智能体在 3-5 分钟内快速构建…

midwayjs 组件配置静态资源

midwayjs 组件配置静态资源midwayjs组件实际上是支持应用的所有特性的,但是我们可能希望开发的组件也包含静态资源,这样资源直接打包在npm包中,用户安装之后就能使用了,以下是一些说明 关键点因为midwayjs 静态资源…