当前位置: 首页 > news >正文

【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&#xff1a;git merge&#xff08;保留分支结构&#xff09;方法 2&#xff1a;git rebase&#xff08;线性合并提交历史&#xff09;直接在master分支执行git merge br_feature&#xff0c;再 执行 git pull --reba…...

WPF 相比 winform 的优势

wpf 相比 winform 的一些优点&#xff0c;网上也是众说纷纭&#xff0c;总的来说包括下面几点&#xff1a; 丰富的视觉效果&#xff1a;能够创建更具吸引力和现代化的用户界面&#xff0c;支持更复杂的图形和动画效果。不需要像 winform 一样&#xff0c;稍微做一点效果&#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 系统中&#xff0c;mkdir 命令用于创建目录。它是文件系统管理中最基础的命令之一&#xff0c;广泛应用于日常操作和系统管理中。本文将深入探讨 mkdir 命令的功能、使用场景、高级技巧&#xff0c;并结合 GNU Coreutils 的源码进行详细分析。 1. mkdir 命令的基本用法…...

【人工智能解读】神经网络(CNN)的特点及其应用场景器学习(Machine Learning, ML)的基本概念

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…...

Linux栈帧

相关寄存器&指令 寄存器 rax&#xff08;accumulator&#xff09;&#xff1a;return value rbx&#xff08;base&#xff09; rcx&#xff08;count&#xff09;&#xff1a;4st argument rdx&#xff08;data&#xff09;&#xff1a;3st argument rsi&#xff08;sour…...

leetcode刷题——回溯算法(1)

目录 77题. 组合 216.组合总和III 17.电话号码的字母组合 39. 组合总和 40.组合总和II 131.分割回文串 93.复原IP地址 78.子集 90.子集II 491.非递减子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解数独 回溯的本质是穷举&#xff0c;穷举所有…...

3D相框案例讲解(详细)

前言 通过现阶段的学习&#xff0c;我们已经掌握了HTML&#xff0c;CSS和JS部分的相关知识点&#xff0c;现在让我们通过一篇案例&#xff0c;来巩固我们近期所学的知识点。 详细视频讲解戳这里 任务一 了解目标案例样式 1.1了解案例 3D相框 1.2 分析案例 首先我们看到一个…...

制作安装包

使用打包工具&#xff08;如 NSIS、Inno Setup、Advanced Installer&#xff09;制作安装包。 示例&#xff1a;Inno Setup 制作安装包 Inno Setup Inno Setup 是一个免费且强大的安装包制作工具&#xff0c;可以用来打包 Qt 项目或其他软件程序。以下是使用 Inno Setup 制作…...

P8615 拼接平方数 P8699 排列数

文章目录 [蓝桥杯 2014 国 C] 拼接平方数[蓝桥杯 2019 国 B] 排列数 [蓝桥杯 2014 国 C] 拼接平方数 题目描述 小明发现 49 49 49 很有趣&#xff0c;首先&#xff0c;它是个平方数。它可以拆分为 4 4 4 和 9 9 9&#xff0c;拆分出来的部分也是平方数。 169 169 169 也有…...

【C语言】拆解C语言的编译过程

前言 学习C语言的过程中&#xff0c;涉及到各种各样的关键词&#xff0c;在我们点击编译的时候&#xff0c;都会做什么呢&#xff1f;让我们来拆解一下 C语言的编译过程 C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型&am…...

【C++】青蛙跳跃问题解析与解法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述第一部分&#xff1a;基本青蛙过河问题第二部分&#xff1a;石柱和荷叶问题 &#x1f4af;解题思路与分析第一部分&#xff1a;青蛙过河问题解法思路&#xff1a;递…...

自动驾驶AVM环视算法--python版本的俯视TOP投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…...

Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅

一、引言 结对编程作为一种软件开发方法&#xff0c;在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心&#xff0c;深入探讨时间拳击理论下的结对编程。 在当今软件开发领域&#xff0c;高效的开发方法和…...

Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144516882 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

ElasticSearch 常见故障解析与修复秘籍

文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高&#xff0c;read_only状态问题解决六…...

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…...

对rust的全局变量使用drop方法

文章目录 rust处理全局变量的策略方法1&#xff1a;在main中自动Drop全局变量 参考 rust处理全局变量的策略 Rust 的静态变量不会在程序退出时自动调用 Drop&#xff0c;因为它们的生命周期与进程绑定。 use std::sync::OnceLock;struct GlobalData {content: String, }impl …...

Node.js教程入门第一课:环境安装

对于一个程序员来说&#xff0c;每学习一个新东西的时候&#xff0c;第一步基本上都是先进行环境的搭建&#xff01; 从本章节开始让我们开始探索Node.js的世界吧! 什么是Node.js? 那么什么是Node.js呢&#xff1f;简单的说Node.js 就是运行在服务端的 JavaScript JavaScript…...

Visual Studio 使用 GitHub Copilot 扩展

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...