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
英文地址,請注明出處:http://en.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;為工業、醫療、家居、農業、智慧城市五大場景提供穩定、低功耗、可擴展的物聯網終端與平臺一體化解決方案。以下董技叔軟件…