git杀手级功能 —— 分支管理

news2024/11/25 16:54:17

目录

分支介绍

创建分支

 切换分支

和并分支

 删除分支

合并冲突

分支管理策略

分支策略

bug分支

其他问题

 强行删除临时分支

结语


分支介绍

在版本回退里发现:每次提交,git都会把它们穿成一条时间线,而这条时间线就可以理解为一个分支。截止到现在,在git里,这个分支叫主分支,即master分支。

再来理解一下HEAD,严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的是当前分支

 每次提交,master分支都会向前移动一步,master分支的线也会也来越长

[az@VM-8-7-centos gitcode]$ cat .git/HEAD
ref: refs/heads/master
[az@VM-8-7-centos gitcode]$ cat .git/refs/heads/master
341b701b4a690982616de789502d40c0e37eb160

创建分支

git支持我们查看或支持其他分支,在这里我们来创建一个自己的分支dev,

git branch 查看当前本地所有分支

git branch dev 新建分支dev

[az@VM-8-7-centos gitcode]$ git branch
* master
[az@VM-8-7-centos gitcode]$ git branch dev
[az@VM-8-7-centos gitcode]$ git branch
  dev
* master

分支前面有*表示当前所在的分支

[az@VM-8-7-centos gitcode]$  cat .git/refs/heads/*
341b701b4a690982616de789502d40c0e37eb160
341b701b4a690982616de789502d40c0e37eb160
[az@VM-8-7-centos gitcode]$ cat .git/refs/heads/dev
341b701b4a690982616de789502d40c0e37eb160

发现目前dev和master指向同一个修改,也可以验证HEAD目前是指向master的

 切换分支

git checkout [分支名]  命令可以切换dev

[az@VM-8-7-centos gitcode]$ git checkout dev
D       README
Switched to branch 'dev'
[az@VM-8-7-centos gitcode]$ cat .git/HEAD
ref: refs/heads/dev

切换分支后,查看HEAD指针发现HEAD指向dev分支

这时候,在dev分支下,向Readme文件添加代码:

然后切换回master分支

 

 发现没有新添加的代码,这时候我们查看两个分支的指向:

[az@VM-8-7-centos gitcode]$  cat .git/refs/heads/dev
6893cfc3ed6d216e6f1b1b9922f4b3bd6ce81117
[az@VM-8-7-centos gitcode]$  cat .git/refs/heads/master
341b701b4a690982616de789502d40c0e37eb160

发现两个分支指向的提交是不同的

这里就能明白了,因为我们是在dev分支上提交的,而master分支此刻的提交点并没有变,此时的状态如图:

 切换到master当然看不到提交了

和并分支

为了在master主分支上能看到新的提交,就需要把dev分支合并到master分支

合并命令:git merge dev    把dev分支合并到当前分支上

[az@VM-8-7-centos gitcode]$ git branch
  dev
* master
[az@VM-8-7-centos gitcode]$ git merge dev
Updating 341b701..6893cfc
Fast-forward
 Readme | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
[az@VM-8-7-centos gitcode]$ cat Readme 
hello world
for new branch

这样就能看到新提交的代码了

(Fast-forward 代表“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。还有其他方式的合并)

 删除分支

合并完成后,dev分支对我们来说就没有用了,保持良好的习惯,删除掉没用的分支

注意:不能删除当前所在的分支,必须先切换到其他分支上

删除命令:git branch -d dev   删除dev分支

[az@VM-8-7-centos gitcode]$ git branch
  dev
* master
[az@VM-8-7-centos gitcode]$ git branch -d dev
Deleted branch dev (was 6893cfc).
[az@VM-8-7-centos gitcode]$ git branch
* master

合并冲突

但是在dev分支提交后,master分支也有提交,这时再合并,就有可能造成合并冲突

创建新分支dev1演示。  新命令:git checkout -b dev1可以完成创建和切换两步动作

[az@VM-8-7-centos gitcode]$ git checkout -b dev1
D       README
Switched to a new branch 'dev1'
[az@VM-8-7-centos gitcode]$ git branch
* dev1
  master

添加新代码并提交:

master也添加新代码并提交

 

 合并分支

[az@VM-8-7-centos gitcode]$ git merge dev1
Auto-merging Readme
CONFLICT (content): Merge conflict in Readme
Automatic merge failed; fix conflicts and then commit the result.

这时候发现两个分支的东西都出现了

 这时候我们必须手动调整冲突代码。并需要再次提交修正后的结果(必须要再次提交)

 此时的状态就变成了:

 合并后不要忘记删除dev1分支git branch -d dev1

分支管理策略

通常合并分支时,git会采用Fast forward模式。这种模式下,删除分支后,查看分支历史时,会丢掉分支信息,看不出来到底是merge合并进来的还是正常提交的

但是在合并冲突时,就不是Fast forward模式了,这样的好处是,从分支历史上就可以看出分支信息了(即使后来删除dev1分支,也能看到master其实是由其他分支合并得到的)

当然我们也可以强制禁用Fast forward模式,也就会在merge时生成一个新的commit,方面查看信息。下面我们尝试禁用Fast forward模式:

创建并切换新分支dev2

[az@VM-8-7-centos gitcode]$ git checkout -b dev2
Switched to a new branch 'dev2'

 修改并提交新代码

 以--no-ff方式合并分支,因为会创建新的commit 所以要-m把描述写进去

[az@VM-8-7-centos gitcode]$  git merge --no-ff -m "merge with no-ff" dev2
Merge made by the 'recursive' strategy.
 Readme | 1 +
 1 file changed, 1 insertion(+)

查看分支历史:(--graph以分支图的方式展示)

 

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

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能直接在上面写代码;

工作应该都在dev分支上,也就是说dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

bug分支

加入我们现在正在dev分支上进行开发,突然发现master分支上有bug需要解决,可是现在git的代码开发了一半,还无法提交怎么办?

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

:git stash
Saved working directory and index state WIP on dev2: 41b082f modify ReadMe
:gitcode$ git status
On branch dev2
nothing to commit, working tree clean

用git status查看工作区,就是干净的,因此可以放心地创建分支来修复bug

修复后

刚才的工作东西用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} 

其他问题

我们有时候在其他分支上写代码时,master分支被修复了一个bug,这时候我们再合并可能就会有冲突

 这个时候,我们应该先在dev上合并下master(就是更新master),然后再让master去合并dev

这样做的目的是有冲突可以在本地分支解决并测试,而不影响master

 强行删除临时分支

有时候,如果分支的代码写到一半突然作废了

使用git branch -d是不能删除这个分支的,因为还没有提交

所以有了新方法:

git branch -D dev 这样可以强行删除分支dev

结语

分支在实际中有什么用呢?假设你准备开发⼀个新功能,但是需要两周才能完成,第⼀周你写了50% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全 部写完再一次提交,又存在丢失每天进度的巨大风险。 现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上 正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再⼀次性合并到原来的分支上,这样,既安全,又不影响别人工作。并且 Git 无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

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

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

相关文章

数据库监控与调优【十八】—— Percona Toolkit调优神器安装与使用

Percona Toolkit调优神器安装与使用 Percona Toolkit安装 本文基于Percona Toolkit 3.2.0,理论支持所有版本。 Percona Toolkit是一款MySQL世界里面非常实用的工具套件,如何安装它。 Windows系统 不支持。详见https://forums.percona.com/discussion/…

vue 一直运行 /sockjs-node/info?t=解决办法

sockjs-node介绍 sockjs-node 是一个JavaScript库,提供跨浏览器JavaScript的API,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。 服务端:sockjs-node(https://github.com/sockjs/sockjs-node)客户端&…

短视频抖音账号矩阵系统源码开发者自研(二)

一、短视频账号矩阵系统源码开发储存集群化开发运转更快 短视频账号矩阵系统源码开发采用储存集群化开发,可以显著提高系统的运转速度和效率。通过优化储存结构和算法,系统能够更快地处理短视频账号数据,确保用户能够流畅地浏览和观看短视频…

6.4 原子引用

1、什么是原子引用 原子引用以cas的方式实现控制多线程之前的同步,从而保证多线程的安全性 原子引用主要有以下三个类 AtomicReferenceAtomicStampReferenceAtomicMarkableReference 2、demo演示 Slf4j(topic "c.Test35") public class Test35 {pub…

C++day2

一、类和结构体的区别 成员访问权限:类中的成员默认是私有的,需要使用访问修饰符(如public、private、protected)来显式指定访问权限。而结构体中的成员默认是公共的,即可以直接访问。 继承:类支持继承&am…

面向对象高级实战演练之银行系统

面向对象高级实战演练之银行系统 实现功能: 1. 银行管理员(使用管理员密码)查看所有用户信息 2. 进入银行系统提示功能 3. 用户密码管理 4. 账户开户/销户 5. 存款/取款 6. 用户间转账 7. 用户余额查询 8. 常见错误检查和提示代码实现: import random…

【LeetCode】动态规划 刷题训练(六)

文章目录 123. 买卖股票的最佳时机 III题目解析零笔交易一笔交易两笔交易 状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 188. 买卖股票的最佳时机 IV题目解析状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 53. 最大子数组和状态转…

vhost-net-原理-初始化流程-数据传输流程

文章目录 1.vhost net2.vhost-net的初始化流程vhost net设置vhost dev设置vhost vring设置 3.数据收发流程分析3.1 数据发送3.2 数据接收 4ioventfd和irqfd的通知机制4.1ioeventfdqemu侧kvm侧总体效果 4.2irqfdqemu侧kvm侧总体效果 参考: 1.vhost net 传统的virtio…

深入理解Java虚拟机jvm-垃圾收集器日志参数

垃圾收集器日志参数 查看GC基本信息查看GC详细信息查看GC前后的堆、方法区可用容量变化查看GC过程中用户线程并发时间以及停顿的时间查看收集器Ergonomics机制(自动设置堆空间各分代区域大小、收集目标等内容,从Parallel收集器开始支持)自动调…

windows下nginx location root路径问题

Windows版本nginx的多级路径问题 windows 下 nginx location root路径为多级目录的问题解决方案:使用双反斜杠--\\Windows版本的nginx常用命令一览: windows 下 nginx location root路径为多级目录的问题 nginx的windows版本中location路径为多级目录 需…

Git客户端:Tower for Mac 注册版

Tower是一款Mac OS X系统上的Git客户端软件,它提供了丰富的功能和工具,帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点: 1. 界面友好:Tower的界面友好,使用户能够轻松地掌握软件的使用方法。 …

【vs2022】MSVCRTD.lib 4098: 默认库“libcmtd.lib”与其他库的使用冲突

verbose-print- 整理:warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 讲解的非常详细: Linker 加入命令行选项 To set this linker option in the Visual Studio development environment Open the p…

Chapter 1: Introduction - Why Program? | Python for Everybody 讲义_En

文章目录 Python for Everybody课程简介Python for Everybody (Why Program?)Why should you learn to write programs?Creativity and motivationComputer hardware architectureUnderstanding programmingWords and sentencesConversing with PythonTerminology: Interpret…

MyBatis全篇

文章目录 MyBatis特性下载持久化层技术对比 搭建MyBatis创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件测试功能加入log4j日志功能加入log4j的配置文件 核心配置文件的完善与详解MyBatis的增删改查测试功能 MyBatis获取参数值在IDEA中设置中配置文…

Java Web HTMLCSS(2)23.6.28

2,CSS 2.1 概述 CSS 是一门语言,用于控制网页表现。我们之前介绍过W3C标准。W3C标准规定了网页是由以下组成: 结构:HTML表现:CSS行为:JavaScript CSS也有一个专业的名字:Cascading Style Sh…

Springboot 如何自动上传秒杀商品数据到Redis中上架商品

一、概述 如下图秒杀活动: 在这个秒杀活动中,需要自动上架一定时间段的商品,我们如何实现自动上传呢? 我们可以通过定时任务来实现的。在秒杀活动开始前,需要将商品信息存储到数据库中,并设置好库存和价格…

Linux学习之进程的通信方式信号:kill命令

kill -l可以看到可以使用信号量。 把下边的内容使用编辑器,比如vim写到./a.sh。 #!/bin/bashecho $$ while : # 无限循环 do: donecat a.sh看一下文件里边的内容。 chmod ur,ux a.sh给当前用户赋予a.sh文件的写和执行权限。 在第一个端口里边,使用./a…

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

在本文中,我们将学习如何通过组合类型运算符和枚举来提取和声明常量类型typeof,以使您的代码库得到优化。keyof 先决条件 为了获得更好的编码体验,您应该在 IDE 中安装 TypeScript,例如VSCode。它将为您提供许多基本功能&#xff…

Linux——进程通信之共享内存

目录 一. 回顾上文 二.共享内存 1.定义 2.特点: 3.实现步骤: 如下为成功链接共享内存使用权的完整步骤: 4.函数介绍 4.1shmget函数 4.1.2参数介绍 4.2ftok函数: 4.2.1参数介绍 关于ftok(); shmget();函数的代码实验…