[Git][分支管理][下]详细讲解

news2024/9/28 9:31:32

目录

  • 1.合并冲突
  • 2.分支管理策略
  • 3.分支策略
    • 1.基本原则
    • 2.bug分支
    • 3.删除临时分支


1.合并冲突

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

    • dev分支在写一部分代码,而master分支也没闲着,也在写着同一份代码
    • 两份代码都将自己的代码commit了,此时再合并分支,就会出现问题
      $ git merge dev
      Auto-merging dev.txt
      CONFLICT (content): Merge conflict in dev.txt
      Automatic merge failed; fix conflicts and then commit the result.
      
      请添加图片描述
  • 解决方案:在发生冲突的文件内手动调整解决,并进行一次 修改 && 提交 操作

    • Git会用<<<<<<<, =======, >>>>>>>来标记出不同分支的冲突内容
      $ cat dev.txt
      I'm in dev_branch :P
      
      <<<<<<< HEAD
      From master_branch
      =======
      From dev_branch
      >>>>>>> dev
      
    • 删除冲突内容后,重新git add, git commit
      $ git add .
      $ git commit -m "chose the master version"
      [master ab30dfd] chose the master version
      
      请添加图片描述
  • git log添加--graph --abbrev-commit参数可以看到分支的合并情况
    请添加图片描述


2.分支管理策略

  • 通常合并分⽀时,如果可能,Git会采⽤Fast forward模式

    • 换句话说,只要条件允许,Git就会尽可能地采用Fast forward模式
  • 但是如果采用Fast forward模式之后,形成的合并结果是怎样的呢?

    • Fast forward模式下,删除dev分支后,查看分支历史时,会丢失分支信息
    • 导致看不出来最新提交到底的merge进来的还是正常提交的
      $ git log
      commit 23bed4ed226e91a17d6c7fd09303c9a152057f42 (HEAD -> master, dev)
      Author: DieSnowK <1752351098@qq.com>
      Date:   Wed Jul 24 15:19:38 2024 +0800
      
      	md dev.txt
      
      请添加图片描述
  • 在合并冲突时,通过手动调整解决冲突,会再进行一次 修改 && 提交 操作

    • 此时就不是Fast forward模式了
    • 好处:从分支历史上可以看出分支信息
      • 例如:已经删除了dev分支,但是仍然可以看到master是由其他分支合并得到的
      $ git log
      commit 7d05eb48eccc9ca23297791d5ee41b2e1862ab5e (HEAD -> master)
      Merge: 23bed4e 923a843
      Author: DieSnowK <1752351098@qq.com>
      Date:   Wed Jul 24 15:30:16 2024 +0800
      
      	merge dev with no-ff
      
      请添加图片描述
  • Git支持用户强制禁用Fast forward模式,那么就会在merge时生成一个新的commit

    • 命令git merge --no-ff branch_name
      • --no-ff参数表示禁用Fast forward模式
      • 禁用Fast forward模式后合并会创建一个新的commit,所以还需要加上-m参数
    • 综上,完整命令git merge --no-ff -m "msg" branch_name
    • 这样从分支历史上就可以看出分支信息了
      请添加图片描述
  • 总结

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

3.分支策略

1.基本原则

  • master分⽀应该是⾮常稳定的,也就是仅⽤来发布新版本,平时不能在上⾯⼲活
  • 干活都在dev分⽀上,也就是说,dev分⽀是不稳定的
    • 某个版本发布时,再把dev分⽀合并到master上,在master分⽀发布该版本
  • 每个⼈都在dev分⽀上⼲活,每个⼈都有⾃⼰的分⽀,时不时地往dev分⽀上合并就可以了
    请添加图片描述

2.bug分支

  • 在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除
  • 情景:假如正在dev2分⽀上进⾏开发,开发到⼀半,突然发现master分⽀上⾯有bug,需要解决,可现在dev的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?
    • 解决方案:使用git stash命令,将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时间恢复出来
      • 此时,就可以放心地创建分支来修复bug了
      $ git status
      On branch dev
      Changes not staged for commit:
        (use "git add <file>..." to update what will be committed)
        (use "git restore <file>..." to discard changes in working directory)
      		modified:   SnowK.txt
      
      no changes added to commit (use "git add" and/or "git commit -a")
      
      $ git stash
      Saved working directory and index state WIP on dev: 2c93d33 Done
      
      $ git status
      On branch dev
      nothing to commit, working tree clean
      
  • 实际操作流程
    • 切回master分支,新建并切换至fix_bug分支,修复bug,重新add, commit
      $ git checkout master
      $ git checkout -b fix_bug
      Switched to a new branch 'fix_bug'
      
      # Fix bugs
      
      $ git add SnowK.txt
      $ git commit -m "Bugs Fix Done"
      [fix_bug 8b8fe09] Bugs Fix Done
       1 file changed, 1 insertion(+), 1 deletion(-)
      
    • 修复完成后,切换到master分支,完成合并,最后删除fix_bug分支
      $ git checkout master
      Switched to branch 'master'
      
      $ git merge --no-ff -m "merge stable branch from fix_bug" fix_bug
      Merge made by the 'ort' strategy.
       SnowK.txt | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
    • 至此,bug已经修复完,可以继续回到dev分支进行开发,恢复之前的开发现场
      • 查看所有的存储情况git stash list
      • 恢复现场并删除该stashgit stash pop
        • git stash apply也可以恢复现场
        • 但是恢复后,stash内容并不会删除,需要用git stash drop来手动删除
        $ git checkout dev
        Switched to branch 'dev'
        
        $ cat SnowK.txt
        Hey I'm SnowK :P
        May be bug?
        
        $ git stash list
        stash@{0}: WIP on dev: 2c93d33 Done
        
        $ git stash pop
        On branch dev
        Changes not staged for commit:
          (use "git add <file>..." to update what will be committed)
          (use "git restore <file>..." to discard changes in working directory)
                modified:   SnowK.txt
        
        no changes added to commit (use "git add" and/or "git commit -a")
        Dropped refs/stash@{0} (122edfbb91bc4a378c38cb7b5bde9dcdf8a1cd61)
        
        $ cat SnowK.txt
        Hey I'm SnowK :P
        May be bug?
        
        dev: I'm codeing...
        
  • 状态图梳理 && 实际开发中的建议
    • master分支的bug修复后,修复后的代码在此时的dev分支里是没有的

      • 毕竟dev里留存的是master上一版的代码
        请添加图片描述
    • 最终目的是要让master合并dev分支,正常情况下肯定是切回master分支直接合并

      • 但这样存在一定的风险
      • 因为在合并分⽀时可能会有冲突,⽽代码冲突需要⼿动解决(在master上解决)
      • 我们⽆法保证对于冲突问题可以正确地⼀次性解决掉,解决的过程中难免手误出错,导致错误的代码被合并到master
        请添加图片描述
    • 解决以上问题的⼀个好的建议

      • 最好先在⾃⼰的分⽀上合并下master ,再让master去合并dev

      • 这样做的⽬的是有冲突可以在本地分⽀解决并进⾏测试,⽽不影响master
        请添加图片描述

        请添加图片描述


3.删除临时分支

  • 添加⼀个新功能时,肯定不希望因为⼀些实验性质的代码,把主分⽀搞乱了
    • 所以每添加⼀个新功能,最好新建⼀个分⽀,可以将其称之为feature分支
    • 在上面开发,完成后合并,最后删除该feature分⽀
  • 如果正在某个feature分支上开发了一半,被产品经理突然叫停,停止该新功能的开发
    • 此时该feature分支就必须就地销毁,留着无用
  • 此时使用传统的git branch -d branch_name命令删除分支是行不通的
    • 因为该分支还没有被mergemaster分支或者其他分支上
    • Git默认只要是被新建出来的分支,都是有用的,会自动保护没有被merge的分支
  • 强制删除git branch -D branch_name
    $ git branch -d dev
    error: The branch 'dev' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D dev'.
    
    $ git branch -D dev
    Deleted branch dev (was d009d1d).
    

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

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

相关文章

MATLAB指针读数识别系统

前言 ①经过在工厂的实地测试&#xff0c;图像采集与传输装置可以正常工作&#xff0c;电脑端可以接收到清晰的图像&#xff0c;并且整个系统具有一定的的抗干扰的能力&#xff0c;在嘈杂的环境中亦可以实现其功能。 ②通过matlab可实现图片的预处理以及指针识别读数识别&…

MySQL笔记(三):修改表

##注&#xff1a;需要在cmd管理员命令行链接mysql再打开sqlyog 一、基本介绍 二、CRUD&#xff08;[create][read][update][delete]&#xff0c;增删改查)语句 1、insert语句 &#xff08;添加数据&#xff09; insert into table_name(第一项&#xff0c;第二项&#xff0…

LeetCode(力扣)数组篇 JAVA刷题详解

1 简介 是不是有许多小伙伴在刷力扣的时候感觉无从下手&#xff1f;从头按顺序开始刷的童鞋们可能会比较有感触&#xff0c;为什么才第四题就感觉很难了?没关系&#xff0c;本文将对力扣的 1-500 题中不需要会员的数据结构与算法题目(数据库与 shell 除外)进行分类&#xff0…

Linux网络编程之dpdk的环境配置详解

文章目录 一、dpdk是什么&#xff1f;二、dpdk的环境配置多队列网卡是什么&#xff1f;怎么判断是否为多队列网卡&#xff1f;怎么修改成多队列网卡&#xff1f;修改内存配置&#xff0c;使其支持hugepage(巨页)下载dpdk编译dpdk 一、dpdk是什么&#xff1f; DPDK&#xff08;…

用苹果Vision Pro隔空操控机器人,英伟达:「人机合一」也不难嘛

昨日,英伟达创始人黄仁勋在 SIGGRAPH 2024 Keynote 演讲中讲到了其人形机器人通用基础模型「Project GR00T」。该模型在功能上迎来了一系列更新。 德克萨斯大学奥斯汀分校助理教授、英伟达高级研究科学家朱玉可发推,在视频中演示了英伟达如何将通用家务机器人大规模仿真训练…

(STM32笔记)十一、通过EXTI外部中断实现 按键控制LED

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 十一、通过EXTI外部中断实现 按键控制LED 十一、通过EXTI外部中断实现 按键控制LED1、按键模块按键原理图按键程序思路 2、中…

【数据结构】mapset详解

&#x1f341;1. Set系列集合 Set接口是一种不包含重复元素的集合。它继承自Collection接口&#xff0c;所以可以使用Collection所拥有的方法&#xff0c;Set接口的实现类主要有HashSet、LinkedHashSet、TreeSet等&#xff0c;它们各自以不同的方式存储元素&#xff0c;但都遵…

Linux常用得操作命令

1.查看ip地址------ifconfig 2.在终端中输入该命令&#xff0c;可以查看当前所在位置------pwd 3.man和–help man命令 1.man命令可以查看某个命令得具体用法 2.man命令怎么翻页 空格 3.man命令按q退出 help命令------help&#xff0c;也可以查看一个命令的帮助&#xff0c…

JavaWeb基础2:XML/Tomcat/Servlet

JavaWeb基础2&#xff1a;XML/Tomcat/Servlet (qq.com)

vim编辑器的使用【vim常用指令介绍】

1.1 vim 简介 vim 编辑器最初是 vi 编辑器&#xff0c;vi 编辑器是 Unix 系统最初的编辑器。允许查看文件内容和在文件中移动、插入、编辑和替换文本。后来开发人员对它做了一些改进。并重命名为 vim。 1.2 学习 vim 的理由 因为几乎任何一个发行版都有 vi/vim 编辑器&#xf…

从手动到自动:WMS系统带来的仓储革命

仓库管理系统&#xff08;WMS&#xff0c;Warehouse Management System&#xff09;在仓储业的发展中扮演了至关重要的角色。它的演变从手动管理到自动化管理&#xff0c;不仅大提升了仓储效率&#xff0c;还改变了企业的运营模式。 一、手动管理阶段 在WMS系统普及之前&#…

nginx负载均衡及软件平滑升级!!!

一、负载均衡 早期的网站流量和业务功能都比较简单&#xff0c;单台服务器足以满足基本的需求&#xff0c;但是随着互联网的发展&#xff0c;业务流量越来越大并且业务逻辑也跟着越来越复杂&#xff0c;单台服务器的性能及单点故障问题就凸显出来了&#xff0c;因此需要多台服…

【Visual Studio Code】源代码管理 传入/传出 更改配置开关

July 2024 (version 1.92)版本更新的Visual Studio Code 增加了 【源代码管理 - 传入/传出】的可视化视图。 但是目前发现也会导致加载变慢 占用页面的影响&#xff0c;如果希望关闭该视图&#xff0c; 可以在设置里搜索 scm.showHistoryGraph 关闭即可

计网:从输入URL到网页显示期间发生了什么

1、URL包含的信息 我们输入的url中包含着一些信息&#xff1a; http&#xff1a;表示的此次我们使用的什么协议/www.baidu.com&#xff1a;表示的是我们想要访问的服务器名称&#xff0c;也就是域名dir3/home.html&#xff1a;表示我们所要访问的资源 2、通过DNS解析URL获得I…

JAVA中的JMM(Java 内存模型)详解

1.JMM概念 Java 内存模型&#xff08;Java Memory Model 简称JMM&#xff09;是一种抽象的概念&#xff0c;并不真实存在&#xff0c;指一组规则或规范&#xff0c;通过这组规范定义了程序中各个变量的访问方式。 因为在不同的硬件生产商和不同的操作系统下&#xff0c;内存的访…

嵌入式安全:Provencore Secure os

嵌入式安全有何独特之处? 嵌入式安全领域的领导者 ProvenRun 宣布,其旗舰产品 ProvenCore for ARM™ Cortex-A 最近获得了 通用标准 (CC) EAL7 认证。这是全球首创,因为没有其他操作系统或可信执行环境 (TEE) 达到该安全级别。相比之下,移动安全市场上第二安全的 TEE(对于…

版本控制案例:全球虚拟制片领导者Dimension借助Perforce Helix Core管理大型二进制文件,实现跨地域团队协作,简化制作流程(上)

创建虚拟世界和人类角色需要一系列的软件工具。但最终愿景很少是由单一工作室独立完成的。对于大型项目&#xff0c;工作室需要通力合作&#xff0c;将全球的团队成员和数字资产联合起来。 Dimension Studio——体积内容捕捉和虚拟制片领域的领导者——不断将新技术和新方法融…

传统产品经理 vs AI产品经理

随着科技的日新月异和技术的不断革新&#xff0c;AI技术如今已深度融入各行各业&#xff0c;使得身处此领域的产品经理们迎来了前所未有的新挑战与广阔机遇。以下是我精心整理的内容&#xff0c;旨在分享传统产品经理如何顺应时代洪流&#xff0c;成功转型为AI产品经理的策略与…

Java面试之操作系统

1、冯诺依曼模型 运算器、控制器、存储器、输入设备、输出设备 32位和64位CPU最主要区别是一次性能计算多少字节数据&#xff0c;如果计算的数额不超过 32 位数字的情况下&#xff0c;32 位和 64 位 CPU 之间没什么区别的&#xff0c;只有当计算超过 32 位数字的情况下&#…

中国篆刻孙溟㠭凿木《应无所住而生其心》

应无所住而生其心 弘一法师言&#xff1a;学佛不是让你出家&#xff0c;也不是让你变得与众不同。学佛就是一个正常生活的人&#xff0c;一个善良的人懂得用佛法降服自心&#xff0c;消除烦恼所有有皆是虚妄&#xff0c;若见诸相非相&#xff0c;即见真我。 孙溟㠭凿木《应无…