#Git 變基(Rebase)案例

適合學習理解的 Git 變基(Rebase)案例

為了幫助你更好地理解 Git 變基(Rebase)的操作和效果,下面通過一個簡單的案例來演示變基的過程和影響。


案例背景

假設我們有一個 Git 倉庫,包含兩個分支:

  • 主分支(main):包含最新的穩定代碼。
  • 特性分支(feature):開發新功能的分支,從 main 分支的某個舊提交創建。
初始提交歷史
A --- B --- C --- D  (main)\E --- F --- G  (feature)
  • A、B、C、Dmain 分支的提交。
  • E、F、Gfeature 分支的提交,基于 main 分支的提交 B
場景

feature 分支開發期間,main 分支有了新的提交 CD。現在,我們希望將 feature 分支的變更應用到 main 分支的最新提交 D 之后,使提交歷史更加線性。


變基操作步驟

1. 切換到 feature 分支
git checkout feature
2. 執行變基操作
git rebase main
3. Git 的操作過程
  • 找到共同祖先:Git 找到 feature 分支和 main 分支的共同祖先提交 B
  • 應用提交:將 feature 分支上的每個提交(EFG)依次應用到 main 分支的最新提交 D 之后。
  • 解決沖突(如果有):如果在應用提交時遇到沖突,需要手動解決沖突后繼續變基。
4. 變基完成后的提交歷史
A --- B --- C --- D  (main)\E' --- F' --- G'  (feature)
  • E’、F’、G’:變基后的新提交,基于 main 分支的最新提交 D
  • 原提交 E、F、G:被新提交 E’、F’、G’ 替代,提交哈希值發生變化。

詳細步驟演示

步驟 1:創建初始提交歷史
# 初始化倉庫
git init# 創建 main 分支并提交
git checkout -b main
echo "Initial commit" > file.txt
git add file.txt
git commit -m "A"echo "Second commit" >> file.txt
git add file.txt
git commit -m "B"echo "Third commit" >> file.txt
git add file.txt
git commit -m "C"echo "Fourth commit" >> file.txt
git add file.txt
git commit -m "D"# 創建 feature 分支并提交
git checkout -b feature HEAD~3  # 基于提交 B 創建分支
echo "Feature commit 1" >> file.txt
git add file.txt
git commit -m "E"echo "Feature commit 2" >> file.txt
git add file.txt
git commit -m "F"echo "Feature commit 3" >> file.txt
git add file.txt
git commit -m "G"
步驟 2:執行變基操作
# 切換到 feature 分支
git checkout feature# 變基到 main 分支
git rebase main
步驟 3:查看變基后的提交歷史
# 查看提交歷史
git log --oneline --graph --all

輸出示例:

* 1234567 (HEAD -> feature) G' - Feature commit 3
* 2345678 F' - Feature commit 2
* 3456789 E' - Feature commit 1
* 4567890 (main) D - Fourth commit
* 5678901 C - Third commit
* 6789012 B - Second commit
* 7890123 A - Initial commit

案例解析

1. 變基前
  • feature 分支的提交 EFG 基于 main 分支的舊提交 B
  • 提交歷史呈現分支結構,不夠線性。
2. 變基后
  • feature 分支的提交 E'F'G' 基于 main 分支的最新提交 D
  • 提交歷史變得線性,易于閱讀和理解。
3. 提交哈希值變化
  • 變基會重寫提交歷史,導致提交哈希值發生變化(如 E 變為 E')。
  • 這也是變基不適用于已推送的共享分支的原因。

類比理解

類比
想象你正在寫一本小說,main 分支是主線劇情,feature 分支是支線劇情。

  • 變基前:支線劇情基于主線劇情的某個舊章節。
  • 變基后:你將支線劇情的修改應用到主線劇情的最新章節之后,使整個故事更加連貫。

注意事項

  1. 不要在已推送的共享分支上使用 rebase
    如果 feature 分支已經推送到遠程倉庫,并且其他開發者基于該分支進行了開發,使用 rebase 會導致提交歷史不一致,引發問題。

  2. 備份分支
    在進行 rebase 操作前,建議創建分支備份,以防出現問題。

  3. 理解提交歷史
    rebase 會改變提交歷史,需要理解其影響,避免誤操作。


總結

  • 變基(Rebase):將當前分支的變更應用到目標分支的最新提交之后,使提交歷史更加線性。
  • 案例演示:通過 feature 分支變基到 main 分支,展示了變基的操作和效果。
  • 適用場景:本地開發分支整合、清理提交歷史。
  • 注意事項如果分支已經推送到遠程倉庫,其他開發者可能已經基于該分支的提交進行了開發。變基后,提交歷史發生變化,導致其他開發者的本地倉庫與遠程倉庫不一致。 不要對已經推送的記錄進行變基!

變基之后仍然存在兩個分支,但 feature 分支的基準點(base)發生了變化。具體來說,feature 分支原來是基于 main 分支的提交 B,變基后變成了基于 main 分支的最新提交 D。

圖片中, 右邊 在dev分支上 變基

在這里插入圖片描述


變基后合并操作的步驟

1. 前提條件
  • 已完成變基:假設你已經對某個分支(如 feature 分支)執行了 git rebase main,使其基于 main 分支的最新提交。
  • 目標分支:你希望將變基后的 feature 分支合并到 main 分支。
2. 切換到目標分支
git checkout main
  • 目的:確保你在要合并到的目標分支上。
3. 更新目標分支
git pull origin main
  • 目的:確保目標分支是最新的,避免合并沖突。
4. 合并變基后的分支
git merge feature
  • 情況 1:如果變基后沒有沖突,Git 會自動完成合并,生成一個合并提交(如果使用 --no-ff 選項)。
  • 情況 2:如果有沖突,Git 會提示你解決沖突。
5. 解決沖突(如果有)
  • 查看沖突文件
    git status
    
  • 手動編輯沖突文件:解決沖突后,標記沖突已解決:
    git add <conflicted-file>
    
  • 完成合并
    git commit
    
6. 推送更新到遠程倉庫
git push origin main
  • 目的:將合并后的更改推送到遠程倉庫。

變基后合并的注意事項

  1. 確保變基已完成且無沖突

    • 在合并前,確保 feature 分支已經成功變基到 main 分支的最新提交。
    • 解決變基過程中可能出現的沖突。
  2. 避免在已推送的共享分支上變基

    • 如果 feature 分支已經推送到遠程倉庫,并且其他開發者基于該分支進行了開發,變基可能導致問題。
    • 建議:在本地分支上變基,合并前與其他開發者溝通。
  3. 使用 --no-ff 選項(可選)

    • 合并時可以使用 --no-ff(no fast-forward)選項,保留分支歷史,便于查看合并記錄。
    git merge --no-ff feature
    
  4. 備份重要分支

    • 在進行合并操作前,建議備份重要分支,以防出現問題。

變基后合并的優勢

  • 線性提交歷史:變基后,提交歷史更加線性,易于閱讀和理解。
  • 減少合并提交:如果變基成功,合并時可能不會產生額外的合并提交(取決于是否使用 --no-ff)。
  • 清晰的開發流程:通過變基和合并,可以保持代碼庫的整潔和一致性。

變基后合并的示例

場景描述
  • 初始狀態
    • main 分支:A --- B --- C --- D
    • feature 分支:A --- B --- E --- F --- G(基于 B
  • 變基后
    • feature 分支:A --- B --- C --- D --- E' --- F' --- G'(基于 D
合并操作
  1. 切換到 main 分支

    git checkout main
    
  2. 更新 main 分支

    git pull origin main
    
  3. 合并 feature 分支

    git merge feature
    
  4. 解決沖突(如果有)

    • 編輯沖突文件,標記解決,完成合并。
  5. 推送更新

    git push origin main
    
  6. 最終提交歷史

    A --- B --- C --- D --- E' --- F' --- G'  (main, feature)
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75611.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

泰博云平臺solr接口存在SSRF漏洞

免責聲明&#xff1a;本號提供的網絡安全信息僅供參考&#xff0c;不構成專業建議。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權&#xff0c;請及時與我聯系&#xff0c;我將盡快處理并刪除相關內容。 漏洞描述 SSRF漏洞是一種在未能獲取服務器…

MyBatis 動態SQL 詳解!

目錄 一、 什么是動態 SQL&#xff1f;二、 為什么需要動態 SQL&#xff1f;三、 MyBatis 動態 SQL 標簽四、 標簽詳解及示例1、 if 標簽2、 choose、when、otherwise 標簽3、 where 標簽4、 set 標簽5、 foreach 標簽6、 sql、include 標簽 五、 總結 &#x1f31f;我的其他文…

阿里云服務器遭遇DDoS攻擊有爭議?

近年來&#xff0c;阿里云服務器頻繁遭遇DDoS攻擊的事件引發廣泛爭議。一方面&#xff0c;用戶質疑其防御能力不足&#xff0c;導致服務中斷甚至被迫進入“黑洞”&#xff08;清洗攻擊流量的隔離機制&#xff09;&#xff0c;輕則中斷半小時&#xff0c;重則長達24小時&#xf…

如何在Springboot的Mapper中輕松添加新的SQL語句呀?

在如今的軟件開發界&#xff0c;Spring Boot可是非常受歡迎的框架哦&#xff0c;尤其是在微服務和RESTful API的構建上&#xff0c;真的是讓人愛不釋手&#xff01;今天&#xff0c;我們就來聊聊如何為Spring Boot項目中的Mapper添加新的SQL語句吧&#xff01;說起來&#xff0…

Qt 中 findChild和findChildren綁定自定義控件

在 Qt 中&#xff0c;findChild 和 findChildren 是兩個非常實用的方法&#xff0c;用于在對象樹中查找特定類型的子對象。這兩個方法是 QObject 類的成員函數&#xff0c;因此所有繼承自 QObject 的類都可以使用它們。當您需要查找并綁定自定義控件時&#xff0c;可以按照以下…

leecode第19天

15、三數之和 # 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c; # 同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。 # 注意&#xff1a;答案中不可以包含重復…

2109. 向字符串添加空格

2109. 向字符串添加空格 題目鏈接&#xff1a;2109. 向字符串添加空格 代碼如下&#xff1a; class Solution { public:string addSpaces(string s, vector<int>& spaces) {string res "";int j 0;//直接遍歷即可for (int i 0;i < spaces.size();i…

Java Spring Boot 與前端結合打造圖書管理系統:技術剖析與實現

目錄 運行展示引言系統整體架構后端技術實現后端代碼文件前端代碼文件1. 項目啟動與配置2. 實體類設計3. 控制器設計4. 異常處理 前端技術實現1. 頁面布局與樣式2. 交互邏輯 系統功能亮點1. 分頁功能2. 搜索與篩選功能3. 圖書操作功能 總結 運行展示 引言 本文將詳細剖析一個基…

CSRF跨站請求偽造——入門篇【DVWA靶場low級別writeup】

CSRF跨站請求偽造——入門篇 0. 前言1. 什么是CSRF2. 一次完整的CSRF攻擊 0. 前言 本文將帶你實現一次完整的CSRF攻擊&#xff0c;內容較為基礎。需要你掌握的基礎知識有&#xff1a; 了解cookie&#xff1b;已經安裝了DVWA的靶場環境&#xff08;本地的或云的&#xff09;&am…

BT-Basic函數之首字母R

BT-Basic函數之首字母R 文章目錄 BT-Basic函數之首字母Rrandomizercallremoterenamereportreport clearreport fault syndromereport isreport level isreport outreport usingre?savere?storereturnrevision$rexitrinitrli$rndrotaterpmcrpsrun randomize 以下是這段英文的…

CentOS 7 如何掛載ntfs的移動硬盤

CentOS 7 如何掛載ntfs的移動硬盤 前言一、查看硬盤并嘗試掛載(提示無法掛載)二、yum安裝epel-release提示yum被鎖定三、強行終止yum的進程四、yum安裝epel-release完成五、yum安裝ntfs-3g六、此時可正常掛載NTFS硬盤 前言 CentOS 7默認情況下是不支持NTFS的文件系統&#xff…

面試常考簡單操作

參考文章 面試常考簡單操作 快速排序歸并排序Dijkstra自定義排序交替打印奇偶數冒泡排序插入排序堆排序歐幾里得算法求最大公約數單例模式的雙重校驗LRU 快速排序 public class Solution {private static int partition(int[] arr, int left, int right) {int temp arr[left]…

2025圖像處理和深度學習國際學術會議(IPDL 2025)

重要信息 官網&#xff1a;www.IPDL.xyz 時間&#xff1a;2025年4月11-13日 地點&#xff1a;中國-成都 簡介 隨著深度學習和圖像處理技術的迅速發展&#xff0c;相關技術的應用逐漸滲透到各個行業&#xff0c;如醫療影像分析、自動駕駛、安防監控和智能制造等。這些應用的…

RNN萬能逼近定理證明

RNN萬能逼近定理證明 RNN原理圖和數學表達式RNN的萬能逼近定理及其證明證明 RNN原理圖和數學表達式 s t U h t ? 1 W x t b ∈ R D h s_tUh_{t-1}Wx_tb\in\mathbb{R}^{D_h} st?Uht?1?Wxt?b∈RDh? s t ∈ R D h s_t\in\mathbb{R}^{D_h} st?∈RDh? U ∈ R D h D h U\…

算力重構營銷生態:廣電數字人 “造星“ 運動背后的智能革命

一、數字人 "造星" 運動&#xff1a;廣電行業的智能覺醒 當陜西廣電的虛擬主播 "小雅" 在柞水縣融媒體中心實現日更 100 秒新聞&#xff0c;當湖北廣電的 "王丹" 從新聞主播轉型為城市文化 IP&#xff0c;一場由算力驅動的數字人 "造星&qu…

大數據Spark(五十六):Spark生態模塊與運行模式

文章目錄 Spark生態模塊與運行模式 一、Spark生態模塊 二、Spark運行模式 Spark生態模塊與運行模式 一、Spark生態模塊 Spark 生態模塊包括&#xff1a;SparkCore、SparkSQL、SparkStreaming、StructuredStreaming、MLlib 和 GraphX。與 Hadoop 相關的整個技術生態如下所示…

Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central

具體錯誤 [ERROR] Failed to execute goal on project datalink-resource: Could not resolve dependencies for project com.leon.datalink:datalink-resource:jar:1.0.0: Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central (https://repo.maven…

運營商在網狀態查詢API接口如何對接?

運營商在網狀態查詢 API 接口是一種能夠讓開發者通過編程方式查詢手機號碼在運營商網絡中當前狀態的應用程序接口。該接口是一組規范和協議&#xff0c;允許第三方開發者通過特定的編程方式與運營商的系統進行交互&#xff0c;以查詢手機號碼在運營商網絡中的當前狀態。 運營商…

【JavaScript】---- 數組的交集,并集,差集的實現,以及Set對象的交集,并集,差集的詳細介紹和使用

1. 前言 數組的交集,并集,差集的實現。其實本質來說都不算難,但是 Set 類直接實現這些方法,所以我們先自己實現一下,然后再講解一下 Set 類的相同方法。 2. intersection 交集 用數學公式,交集被表示為: A ∩ B = { x ∈ A ∣ x ∈ B } A \cap B = \{x \in A \mid x…

青銅與信隼的史詩——TCP與UDP的千年博弈

點擊下面圖片帶您領略全新的嵌入式學習路線 &#x1f525;爆款熱榜 88萬閱讀 1.6萬收藏 第一章 契約之匣與自由之羽 熔巖尚未冷卻的鑄造臺上&#xff0c;初代信使長歐諾彌亞將液態秘銀倒入雙生模具。左側模具刻著交握的青銅手掌&#xff0c;右側則是展開的隼翼紋章。當星辰…