svn与git Merge重要区别讲解

SVN有哪些merge方式

总的来说,SVN 的 merge 主要有以下 五种类型


1. 同步合并 (Sync Merge) / 追赶合并 (Catch-up Merge)

这是在分支开发过程中最常用的一种合并。

  • 目的:让你的功能分支保持最新,及时获取主干(trunk)上的所有更新,避免与主干偏离太远。

  • 方向主干 (Trunk) -> 分支 (Branch)

  • 常用命令svn merge ^/trunk

  • 执行位置:在 分支 的工作副本中执行。

  • 详细解释
    你在自己的 feature-A 分支上开发,同时其他同事在 trunk 上提交了代码。为了避免最后合并回主干时产生巨大的冲突,你需要定期将 trunk 的“新成果”同步到你的分支上。SVN 的合并追踪 (svn:mergeinfo) 会记住你同步到了哪个版本,下次会自动从那个版本开始继续同步。

    # 1. 切换到你的分支工作目录
    cd D:\dev\my-project\feature-A# 2. 执行同步合并
    svn merge ^/trunk# 3. 解决冲突并提交到你的分支
    svn commit -m "Sync with trunk"
    

2. 重入合并 (Reintegrate Merge)

这是分支开发完成后的最后一步,也是一个非常特殊的合并。

  • 目的:将一个功能分支上所有的“净工作成果”一次性、干净地合并回主干。

  • 方向分支 (Branch) -> 主干 (Trunk)

  • 常用命令svn merge --reintegrate ^/branches/feature-A

  • 执行位置:在 主干 的工作副本中执行。

  • 详细解释
    你的 feature-A 分支开发测试完毕,准备发布。--reintegrate 会智能地计算出这个分支独有的、纯粹的变更(排除了那些从主干同步过来的变更),然后将这些变更应用到主干上。
    黄金法则:执行完 reintegrate 合并后,这个分支的使命就结束了,不应该再被使用。

    # 1. (在分支上) 确保分支已完全同步主干,这是前提!
    # 2. 切换到主干工作目录
    cd D:\dev\my-project\trunk# 3. 执行重入合并
    svn merge --reintegrate ^/branches/feature-A# 4. 检查无误后,提交到主干
    svn commit -m "Reintegrate feature-A into trunk"
    

3. 拣选合并 (Cherry-pick Merge)

当你只需要某个分支上的特定几次提交,而不是全部分支内容时使用。

  • 目的:像摘樱桃一样,精确地“摘取”一个或多个特定版本的变更,应用到当前工作副本。

  • 方向:任意 URL -> 当前工作副本

  • 常用命令svn merge -c <版本号> <源URL>svn merge -r <N:M> <源URL>

  • 执行位置:在 目标(想应用变更的地方)工作副本中执行。

  • 详细解释
    最常见的场景是 紧急修复 (Hotfix)。比如,你在 trunkr345 版本修复了一个严重 bug,但此时发布出去的是基于 release-1.0 分支的代码。你不需要将 trunk 的所有新功能都合并到发布分支,只需要 r345 这一个修复。

    # 1. 切换到你的发布分支工作目录
    cd D:\dev\my-project\release-1.0# 2. 拣选合并 r345 这一个提交
    # -c 345 等同于 -r 344:345
    svn merge -c 345 ^/trunk# 3. 检查并提交到发布分支
    svn commit -m "Cherry-pick fix from r345 of trunk"
    

4. 差异合并 (Differential Merge) / 两棵树合并 (Two-Trees Merge)

这是 SVN merge 最底层、最根本的形式,也是最强大的。

  • 目的:计算两个任意 URL(可以在不同版本)之间的差异,并将这个差异作为补丁应用到当前工作副本。

  • 方向URL1@REV1URL2@REV2 之间的差异 -> 当前工作副本

  • 常用命令svn merge <URL1@REV1> <URL2@REV2>

  • 执行位置:在 目标 工作副本中执行。

  • 详细解释
    这种合并方式不关心历史或血缘关系。它就是纯粹的“找不同,然后应用”。这在处理 没有共同祖先的分支合并 时非常有用。比如,你想将一个完全独立的项目 project-B 的代码强行合并到 project-A

    # 假设 ^/utils/empty 是一个空目录
    # 计算“空”和“project-B”的差异,结果就是“添加所有project-B的文件”
    svn merge ^/utils/empty ^/projects/project-B .
    

    另一个更现代的实现方式是使用 --ignore-ancestry 参数,它的效果类似。

5. 反向合并 (Reverse Merge)

本质上是拣选合并或差异合并的一种特殊用法,目的是撤销一个或多个已经提交的变更。

  • 目的:回滚(Revert)某个已经提交的版本。

  • 方向:将历史变更“反向”应用到当前工作副本。

  • 常用命令svn merge -c -<版本号> <源URL>svn merge -r <M:N> <源URL> (其中 M > N)

  • 执行位置:在你想撤销变更的分支/主干的工作副本中执行。

  • 详细解释
    你发现 r250 这次提交引入了一个严重的 bug,需要立即撤销。

    # 假设你在 trunk 的工作副本中
    # -c -250 的意思是“应用 r250 的反向变更”
    svn merge -c -250 .# 或者使用版本范围,注意顺序是反的
    # svn merge -r 250:249 .# 提交这次“撤销操作”
    svn commit -m "Revert commit r250 due to bug X"
    

总结表格

合并类型核心目的方向常用命令关键点
同步合并让分支保持最新Trunk -> Branchsvn merge ^/trunk在分支生命周期中会多次执行
重入合并将分支成果合并回主干Branch -> Trunksvn merge --reintegrate ^/branch分支生命周期最后一次操作,之后分支废弃
拣选合并应用特定的变更任意URL -> 当前目录svn merge -c <REV>常用于紧急修复,只拿需要的变更
差异合并计算并应用任意两点间的差异URL1 vs URL2 -> 当前目录svn merge <URL1> <URL2>最底层原理,可用于合并无关联分支
反向合并撤销已提交的变更历史变更 -> 当前目录svn merge -c -<REV>用于回滚错误提交

理解了这五种目的,你就能在任何场景下选择最合适的 merge 方式了。
注:合并无关联分支时需要–ignore-ancestry

对于Git,又是怎样的呢

总结对比表

SVN 合并类型核心目的Git 主要对应功能Git 哲学与备注
同步合并分支获取主干更新git merge maingit rebase mainmerge 保留合并痕迹;rebase 创造线性历史,更整洁。
重入合并分支合并回主干git merge <branch>标准做法。可配合 rebase 实现无合并节点的线性历史。
拣选合并摘取特定提交git cherry-pick <hash>功能完全同名,用法一致,是 Git 的标准功能。
差异合并合并无关联分支git merge --allow-unrelated-historiesGit 有专门的参数来处理这种特殊情况。
反向合并撤销已提交的变更git revert <hash>revert 是一个专门、安全的撤销命令,它会创建新的提交。

也就是说 git 的merge 不需要特别指定reintegrate,另外git提供了更强大的rebase功能

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

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

相关文章

Vue 3 入门教程5 - 生命周期钩子

一、生命周期概述Vue 组件从创建到销毁的整个过程称为生命周期&#xff0c;在这个过程中&#xff0c;Vue 会自动触发一系列的函数&#xff0c;这些函数被称为生命周期钩子。通过生命周期钩子&#xff0c;我们可以在组件的不同阶段执行特定的操作&#xff0c;例如初始化数据、发…

负载均衡Haproxy

简介 HAProxy是一款高性能、开源的负载均衡器与反向代理服务器&#xff0c;主要用于 HTTP、TCP等协议的流量分发&#xff0c;广泛应用于高并发、高可用的网络架构中 HAProxy是法国威利塔罗&#xff08;Willy Tarreau&#xff09;使用C语言开发的一个开源软件 企业版&#xff1a…

PostgreSQL锁机制详解:从并发控制到死锁检测

PostgreSQL锁详解 ————向逍xiangxiaohighgo.com 首先要讲锁的话&#xff0c;必须得先了解并发控制。数据库中的对象都是共享的&#xff0c;如果同时间不同的用户对同一个对象进行修改&#xff0c;就会出现数据不一致的情况。所以如果要实现并发访问&#xff0c;就需要对这…

【启发式算法】RRT*算法详细介绍(Python)

&#x1f4e2;本篇文章是博主人工智能&#xff08;AI&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

Docker架构深度解析:从核心概念到企业级实践

Docker架构深度解析&#xff1a;从核心概念到企业级实践一、Docker架构全景图1.1 整体架构示意图二、核心组件深度解析2.1 Docker Daemon工作机制三、镜像与容器原理3.1 镜像分层结构3.2 容器生命周期四、网络架构详解4.1 网络模式对比4.2 Bridge网络实现原理五、存储架构与实践…

PPT自动化 python-pptx - 8: 文本(text)

在使用 python-pptx 库操作 PowerPoint 文档时&#xff0c;理解文本的结构和处理方式至关重要。本文将深入探讨文本在形状中的组织层级、访问方式以及各级别的格式化选项。文本容器与层级结构可容纳文本的形状&#xff1a; 只有自动形状 (Auto shapes) 和表格单元格 (table cel…

使用realsense进行目标检测并标识目标深度

涉及知识点都在代码中注释了&#xff0c;直接看代码 // This example is derived from the ssd_mobilenet_object_detection opencv demo // and adapted to be used with Intel RealSense Cameras // Please see https://github.com/opencv/opencv/blob/master/LICENSE#includ…

OpenWrt Network configuration

OpenWrt Network configuration device 和 interface 关系device device 表示底层的网络设备&#xff0c;如物理网卡、桥接设备&#xff08;bridge&#xff09;、VLAN 设备等。 通过 config device 定义&#xff0c;描述设备类型、端口成员、VLAN 等属性。 例如&#xff1a;br…

VuePress 使用详解

一、核心概念 VuePress 是 Vue.js 团队开发的静态网站生成器&#xff0c;专为技术文档优化&#xff0c;具备以下特性&#xff1a; Markdown 优先&#xff1a;原生支持 Markdown 语法扩展Vue 驱动&#xff1a;可在 Markdown 中使用 Vue 组件默认主题优化&#xff1a;内置响应式…

AI大模型前沿:Muyan-TTS开源零样本语音合成技术解析

AI大模型前沿&#xff1a;Muyan-TTS开源零样本语音合成技术解析引言&#xff1a;语音合成技术的演进与Muyan-TTS的突破性意义语音合成&#xff08;Text-to-Speech, TTS&#xff09;技术作为人机交互的核心接口之一&#xff0c;自20世纪30年代贝尔实验室首次尝试电子语音合成以来…

c# everthing.exe 通信

1 获取everthing进程 调用 Everything 搜索创建SearchWithEverything函数using Microsoft.Win32; using System; using System.Diagnostics; using System.IO; using System.Management; using System.Text;class EverythingHelper {// 方法 1&#xff1a;从进程获取路径publi…

Gitee:中国企业级DevOps平台的本土化突围之路

Gitee&#xff1a;中国企业级DevOps平台的本土化突围之路 在国内数字化转型浪潮下&#xff0c;DevOps平台作为企业研发效能提升的核心引擎&#xff0c;正在经历从工具到生态的全面升级。作为国内领先的一站式DevOps解决方案&#xff0c;Gitee凭借其本土化优势与全链路服务能力&…

C++法则22:运算符 ::* 和 ->* 和 ::* 是独特的整体运算符,是不可分的。

C法则22&#xff1a;运算符 ::* 和 ->* 和 ::* 是独特的整体运算符&#xff0c;是不可分的。1. ::*&#xff08;成员指针声明符&#xff09;作用&#xff1a;用于声明一个指向类成员的指针。语法&#xff1a;ReturnType (ClassName::*pointerName) &ClassName::MemberN…

Linux系统管理习题

Linux 系统管理练习题 1.请为此虚拟机配置以下网络参数&#xff1a; 1&#xff09;主机名&#xff1a;chenyu.example.com &#xff08;将chenyu改成自己名字的全拼&#xff09; 2&#xff09;IP 地址&#xff1a;192.168.100.100/24 3&#xff09;默认网关&#xff1a;192.168…

SQL166 每天的日活数及新用户占比

SQL166 每天的日活数及新用户占比 题目理解 本SQL查询旨在分析用户活跃数据&#xff0c;计算两个关键指标&#xff1a; 每日活跃用户数(DAU)每日新增用户占比(新用户占活跃用户的比例) 解题思路 1. 数据准备阶段 首先我们需要获取所有用户的活跃记录&#xff0c;包括&…

【33】C# WinForm入门到精通 ——表格布局器TableLayoutPanel【属性、方法、事件、实例、源码】

WinForm 是 Windows Form 的简称&#xff0c;是基于 .NET Framework 平台的客户端&#xff08;PC软件&#xff09;开发技术&#xff0c;是 C# 语言中的一个重要应用。 .NET 提供了大量 Windows 风格的控件和事件&#xff0c;可以直接拿来使用。 本专栏内容是按照标题序号逐渐…

uv使用教程

以下是使用 Python 包管理工具 uv 的常见命令指南。uv 是由 Astral&#xff08;Ruff 的开发者&#xff09;开发的高性能 Python 包安装器和解析器&#xff0c;旨在替代 pip 和 pip-tools&#xff1a; 1. 安装 uv uv官网仓库 # Linux/macOS curl -Ls https://astral.sh/uv/in…

SpringBoot3.x入门到精通系列:1.1 简介与新特性

SpringBoot 3.x 简介与新特性 &#x1f4d6; 什么是SpringBoot SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程。SpringBoot集成了大量常用的第三方库配置&#xff0c;SpringBoot应用中这些第三方库几乎可以零配…

二、搭建springCloudAlibaba2021.1版本分布式微服务-Nacos搭建及服务注册和配置中心

nacos介绍 1、Nacos简介 Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、…

浅谈物联网嵌入式程序开发源码技术方案

在物联网蓬勃发展的时代&#xff0c;嵌入式程序作为连接硬件与软件的桥梁&#xff0c;发挥着至关重要的作用。以“边缘智能 云协同”为核心&#xff0c;为工业、医疗、家居、农业、智慧城市五大场景提供稳定、低功耗、可扩展的物联网终端与平台一体化解决方案。以下董技叔软件…