【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge
文章目录
- 1. 场景描述
- 1.1 分支状态
- 2. 推荐的操作方式
- 方法 1:git merge(保留分支结构)
- 方法 2:git rebase(线性合并提交历史)
- 直接在master分支执行git merge br_feature,再 执行 `git pull --rebase
- 方法 3:git cherry-pick(选择性合并提交)
- 最佳操作建议
- F3 和 F3' 的定义
我有一个br_master分支,后来在1.1号建了一个特性分支 br_feature,在br_feature上有3个新提交 ,分别1.2 1.4 1.6号的提交,然后在br_master有2个提交,分别是1.3 1.5,现在我要把br_feature上的3个提交 合并到 br_master上,好的操作是什么?
1. 场景描述
1.1 分支状态
【主分支 br_master:】
-
1月1日创建,包含以下提交:
- C1 (1.1 初始提交)
-
在 1月3日和 1月5日,有两次新增提交:
- C2 (1.3 提交 2)
- C3 (1.5 提交 3)
当前状态:
C3 (1.5) -> br_master 提交 3
C2 (1.3) -> br_master 提交 2
C1 (1.1) -> 公共祖先
【特性分支 br_feature】
- 于 1月1日从 br_master 分支创建。
- 在 1月2日、1月4日、1月6日,有 3 次提交:
- F1 (1.2 提交 1)
- F2 (1.4 提交 2)
- F3 (1.6 提交 3)
当前状态:
F3 (1.6) -> br_feature 提交 3
F2 (1.4) -> br_feature 提交 2
F1 (1.2) -> br_feature 提交 1
C1 (1.1) -> 公共祖先
2. 推荐的操作方式
方法 1:git merge(保留分支结构)
【切换到 br_master 分支】:
git checkout br_master
【合并 br_feature】:
git merge br_feature
【结果】:
提交历史中会生成一个合并提交:
* M -> 合并提交 //merge提示
|\
| * F3 (1.6) -> br_feature 提交 3 //有分叉记录
| * F2 (1.4) -> br_feature 提交 2
| * F1 (1.2) -> br_feature 提交 1
* | C3 (1.5) -> br_master 提交 3
* | C2 (1.3) -> br_master 提交 2
* C1 (1.1) -> 公共祖先
【优点】:
- 保留特性分支的独立开发历史。
- 生成一个清晰的分支合并点,方便回溯。
【适用场景】:
团队协作中,适合需要完整历史记录的项目。
【操作安全性】:
特性分支和主分支的历史均未被修改,适合已经推送到远程仓库的分支。
方法 2:git rebase(线性合并提交历史)
【切换到 br_feature 分支】:
git checkout br_feature
【将 br_feature 的提交重新应用到 br_master 最新提交之后】:
git rebase br_master
【切换回 br_master 分支并快进合并】:
git checkout br_master
git merge br_feature
【结果】:
提交历史变为线性,按时间顺序排列:
* F3' -> br_feature 提交 3(重新生成的提交)
* F2' -> br_feature 提交 2
* F1' -> br_feature 提交 1
* C3 -> br_master 提交 3
* C2 -> br_master 提交 2
* C1 -> 公共祖先
【优点】:
- 提交历史变得干净和线性,适合需要简单提交记录的项目。
- 易于代码审查。
【适用场景】:
单人开发,或者特性分支尚未推送到远程仓库。
【注意事项】:
如果 br_feature 已经推送到远程仓库,执行 rebase 后可能需要强制推送(git push --force)。
直接在master分支执行git merge br_feature,再 执行 `git pull --rebase
有什么区别?
有区别,区别在于 此时merge记录是仍存在的。
相同点是都提交到了master最新提交之后

方法 3:git cherry-pick(选择性合并提交)
【切换到 br_master 分支】:
git checkout br_master
【逐一挑选 br_feature 的提交】:
git cherry-pick <commit_hash_F1>
git cherry-pick <commit_hash_F2>
git cherry-pick <commit_hash_F3>
【结果】:
提交历史保留了主分支的连续性,br_feature 的提交被以新的哈希值添加到 br_master 上:
* F3' (1.6) -> br_feature 提交 3
* F2' (1.4) -> br_feature 提交 2
* F1' (1.2) -> br_feature 提交 1
* C3 (1.5) -> br_master 提交 3
* C2 (1.3) -> br_master 提交 2
* C1 (1.1) -> 公共祖先
【优点】:
- 可以选择性合并部分提交,而无需整合完整的特性分支。
- 不会引入额外的合并提交或分支上下文。
【适用场景】:
需要调整或精简 br_feature 的提交内容时。
【注意事项】:
- 原始分支历史(br_feature 的上下文)会丢失。
- 如果提交较多,操作可能会比较繁琐。
最佳操作建议
【优先使用 git merge】:
- 保留特性分支的独立性,历史记录清晰。
- 不会修改提交哈希值,适合团队协作。
【在单人开发或对提交历史有严格要求时,使用 git rebase】:
- 线性合并提交,更加简洁。
- 避免生成额外的合并提交。
【在只需部分合并时,使用 git cherry-pick】:
灵活选择提交,适用于特定需求。
F3 和 F3’ 的定义
【F】3:
- 原始提交的标识符。
- 哈希值(commit hash)是在分支 br_feature 上创建时生成的,具体由提交的内容、父提交的哈希值、提交作者和时间等因素决定。
- 它代表了特性分支上特定的提交。
【F3’(带撇号的 F3)】:
- 是原始提交 F3 的一个“重新生成”版本。
- 发生这种情况时,提交的内容可能相同,但父提交的哈希值已改变,从而导致新的提交哈希值(即 F3’)与 F3 不同。
F3’ 通常出现在以下场景:
- git cherry-pick:将 F3 应用到另一个分支上,生成新的提交。
- git rebase:将 F3 的提交内容重新应用到另一分支的最新提交之后,也会生成一个新的提交。
相关文章:
【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge
文章目录 1. 场景描述1.1 分支状态 2. 推荐的操作方式方法 1:git merge(保留分支结构)方法 2:git rebase(线性合并提交历史)直接在master分支执行git merge br_feature,再 执行 git pull --reba…...
WPF 相比 winform 的优势
wpf 相比 winform 的一些优点,网上也是众说纷纭,总的来说包括下面几点: 丰富的视觉效果:能够创建更具吸引力和现代化的用户界面,支持更复杂的图形和动画效果。不需要像 winform 一样,稍微做一点效果&#x…...
PYQT5程序框架
pyqt5程序框架_哔哩哔哩_bilibili 1.UI代码 Qhkuja.py # -*- coding: utf-8 -*-# Form implementation generated from reading ui file Qhkuja.ui # # Created by: PyQt5 UI code generator 5.15.7 # # WARNING: Any manual changes made to this file will be lost when py…...
Linux 中的 mkdir 命令:深入解析
在 Linux 系统中,mkdir 命令用于创建目录。它是文件系统管理中最基础的命令之一,广泛应用于日常操作和系统管理中。本文将深入探讨 mkdir 命令的功能、使用场景、高级技巧,并结合 GNU Coreutils 的源码进行详细分析。 1. mkdir 命令的基本用法…...
【人工智能解读】神经网络(CNN)的特点及其应用场景器学习(Machine Learning, ML)的基本概念
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
Linux栈帧
相关寄存器&指令 寄存器 rax(accumulator):return value rbx(base) rcx(count):4st argument rdx(data):3st argument rsi(sour…...
leetcode刷题——回溯算法(1)
目录 77题. 组合 216.组合总和III 17.电话号码的字母组合 39. 组合总和 40.组合总和II 131.分割回文串 93.复原IP地址 78.子集 90.子集II 491.非递减子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解数独 回溯的本质是穷举,穷举所有…...
3D相框案例讲解(详细)
前言 通过现阶段的学习,我们已经掌握了HTML,CSS和JS部分的相关知识点,现在让我们通过一篇案例,来巩固我们近期所学的知识点。 详细视频讲解戳这里 任务一 了解目标案例样式 1.1了解案例 3D相框 1.2 分析案例 首先我们看到一个…...
制作安装包
使用打包工具(如 NSIS、Inno Setup、Advanced Installer)制作安装包。 示例:Inno Setup 制作安装包 Inno Setup Inno Setup 是一个免费且强大的安装包制作工具,可以用来打包 Qt 项目或其他软件程序。以下是使用 Inno Setup 制作…...
P8615 拼接平方数 P8699 排列数
文章目录 [蓝桥杯 2014 国 C] 拼接平方数[蓝桥杯 2019 国 B] 排列数 [蓝桥杯 2014 国 C] 拼接平方数 题目描述 小明发现 49 49 49 很有趣,首先,它是个平方数。它可以拆分为 4 4 4 和 9 9 9,拆分出来的部分也是平方数。 169 169 169 也有…...
【C语言】拆解C语言的编译过程
前言 学习C语言的过程中,涉及到各种各样的关键词,在我们点击编译的时候,都会做什么呢?让我们来拆解一下 C语言的编译过程 C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型&am…...
【C++】青蛙跳跃问题解析与解法
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述第一部分:基本青蛙过河问题第二部分:石柱和荷叶问题 💯解题思路与分析第一部分:青蛙过河问题解法思路:递…...
自动驾驶AVM环视算法--python版本的俯视TOP投影模式
c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线,获取方式网盘自行获取(非免费介意勿下载):链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…...
Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅
一、引言 结对编程作为一种软件开发方法,在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心,深入探讨时间拳击理论下的结对编程。 在当今软件开发领域,高效的开发方法和…...
Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144516882 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
ElasticSearch 常见故障解析与修复秘籍
文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高,read_only状态问题解决六…...
序列模型的使用示例
序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络(RNN)1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN(1)RNN实例化(2)forward函数(3…...
对rust的全局变量使用drop方法
文章目录 rust处理全局变量的策略方法1:在main中自动Drop全局变量 参考 rust处理全局变量的策略 Rust 的静态变量不会在程序退出时自动调用 Drop,因为它们的生命周期与进程绑定。 use std::sync::OnceLock;struct GlobalData {content: String, }impl …...
Node.js教程入门第一课:环境安装
对于一个程序员来说,每学习一个新东西的时候,第一步基本上都是先进行环境的搭建! 从本章节开始让我们开始探索Node.js的世界吧! 什么是Node.js? 那么什么是Node.js呢?简单的说Node.js 就是运行在服务端的 JavaScript JavaScript…...
Visual Studio 使用 GitHub Copilot 扩展
🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...
AI Agent开发实战系列 - LangGraph(8): 利用add_conditional_edges构建智能决策工作流
1. 理解LangGraph中的条件决策机制 在AI Agent开发中,动态决策能力是区分普通流程和智能系统的关键。LangGraph提供的add_conditional_edges方法就像给工作流装上了"智能导航系统"——我最近在客服工单系统中实践时发现,传统硬编码的分流规则需…...
AudioSeal环境部署:Ubuntu+CUDA 12.x+PyTorch 2.3适配性配置指南
AudioSeal环境部署:UbuntuCUDA 12.xPyTorch 2.3适配性配置指南 1. 引言 如果你正在寻找一种可靠的方法来为AI生成的音频打上“数字指纹”,以便后续进行检测和溯源,那么Meta开源的AudioSeal项目绝对值得你花时间研究。简单来说,A…...
Clipboard命令行参数完整指南:掌握所有可用选项的终极手册
Clipboard命令行参数完整指南:掌握所有可用选项的终极手册 【免费下载链接】Clipboard 😎🏖️🐬 Your new, 𝙧𝙞𝙙𝙤𝙣𝙠𝙪𝙡…...
OpenClaw小龙虾初体验【安装学习】
文章目录一、前言二、安装三、360安全龙虾四、腾讯龙虾4.1 文件移动4.2 应用分析4.3 Docker失败原因一、前言 最近小龙虾很火,不禁能说还能做,本质就类似木马,获取电脑权限,不禁能操作各应用还能联动外接设备。 那肯定要学习一下…...
GameFramework——FileSystem篇
目录 一、快速入门 1.1 什么是文件系统模块? 1.2 基本使用步骤 1.2.1 创建文件系统 1.2.2 写入文件 1.2.3 读取文件 1.2.4 删除文件 1.2.5 加载已有文件系统 二、文件布局 2.1 HeaderData(文件头) 2.2 BlockData(块数据…...
OpenClaw二次开发指南:Qwen3.5-9B模型适配与API扩展
OpenClaw二次开发指南:Qwen3.5-9B模型适配与API扩展 1. 为什么需要二次开发OpenClaw? 去年冬天,当我第一次尝试用OpenClaw对接本地部署的Qwen3.5-9B模型时,遇到了几个棘手问题:模型返回的JSON格式与框架预期不符、长…...
Istio Gateway+VirtualService配置不生效?Java服务流量劫持失败的6大隐性原因深度诊断
第一章:Istio GatewayVirtualService配置不生效?Java服务流量劫持失败的6大隐性原因深度诊断Istio 的 Gateway 与 VirtualService 是实现南北向流量治理的核心资源,但 Java 应用在启用 Istio Sidecar 注入后,常出现请求未被 Envoy…...
OpenClaw技能扩展实战:安装Phi-3-vision-128k-instruct专用图文处理模块
OpenClaw技能扩展实战:安装Phi-3-vision-128k-instruct专用图文处理模块 1. 为什么需要专用技能模块? 上周我在整理技术文档时遇到一个典型场景:需要将十几份混杂着截图和文字说明的会议纪要,自动转换成结构化的Markdown文件。当…...
暑期实习面经记录(十四)(java)(4.2号补充下,闪闪改改)
本人最近面的被问的比较多的java八股先完成再完美1.如何设计一个扣减库存或者说秒杀抢券系统2.最近问这个问的比较多多线程->线程池->并发安全->场景2.锁->synconiezed,retranlock->可重入吗->怎么实现的2.1读写锁 怎么实现的;AQS底层;…...
Mojo调用PyTorch模型推理却遭遇内存泄漏?——国家级实验室验证的4层内存隔离架构首次公开
第一章:Mojo调用PyTorch模型推理却遭遇内存泄漏?——国家级实验室验证的4层内存隔离架构首次公开在高性能AI边缘部署场景中,Mojo语言通过其零开销FFI机制调用PyTorch C前端(LibTorch)实现低延迟推理,但实测…...
