【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…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...