效率工具- git rebase 全解

一、前言

對于git rebase 一直不太了解,這幾天想著提高下git提交質量,就發現了這個好用的指令,順便記錄一下,好加深記憶

貼出官方文檔以便大家進一步學習 Git

二、rebase是作用

  • rebase 官方解釋為變基,可以理解為移動你的分支根節點,維護一個更好的提交記錄。rebase把你當前最新分支與其他分支合并時候,會把其他分支的提交記錄放在我們當前分支時間線最開始的位置。也就是說,會把我們的提交記錄整合在公共分支的后面。
  • 簡單來講,合并本地其他分支 為了不產生多余的分叉,及合并記錄時可以使用rebase
  • 接下來我們看一下rebase有哪些應用場景及使用技巧與merge的差異。

三、rebase與merge的差異

  • rebase 會把你當前分支的 commit 放到公共分支的最后面,所以叫變基。就好像你從公共分支又重新拉出來這個分支一樣。
  • merge 會把公共分支和你當前的 commit 合并在一起,形成一個新的 commit 提交。

四、應用場景

  • 你剛入公司,技術leader讓你以 master 分支為基礎,拉出一個分支進行開發需求。此時 master 分支提交記錄為 a、b。你在 dev 分支分別 commit 了2次記錄為 e、f ,有其他同事在 master 分支提交了兩次記錄為 c、d 這個時候你要合并master分支代碼。

  • 當前分支狀態節點如下圖所示:

五、使用git merge 進行合并操作

5.1、結論

  1. 如上圖所示 merge 會把兩個分支合并在一起,形成一個新的 commit 提交記錄。
  2. 我們發現 coomit 提交記錄是把合并的分支記錄放到我們當前dev分支記錄的后面。
  3. 并且coomit 提交記錄會產生分叉

七、使用git rebase 進行合并操作

  $ git rebase master  // 合并master分支代碼$ git log --graph --oneline // 查看log點線圖// 符號解釋:* 表示一個commit, 注意不要管*在哪一條主線上 | 表示分支前進 / 表示分叉 \ 表示合入

7.1、結論

  1. 首先,我們發現目前 dev 分支上面的提交記錄為 abcdef 并沒有像 merge 一樣產生新的提交記錄
  2. 其次 rebase master 分支到 dev 分支, dev 分支的歷史記錄會添加在 master 分支的后面。
  3. 如圖所示,歷史記錄成一條線,非常整潔,最后并沒有像使 merge 一樣提交記錄產生分叉

八、rebase的使用業務場景

  • 認識到了rebase,讓我們來看看有哪些實戰場景可以參考使用。

8.1 場景一

  • 經典場景,優化本地提交記錄,使其減少分叉。
  • 和上面👆那個經典案例一樣,這里就不做重復描述了😁

8.2 場景二

  • 連續性沖突
  • 此時你從master分支拉出一個dev分支來對以v1版本為基礎a功能進行需求更改,由于項目經理分功能時,讓你的同事也對master分支中的a功能中的某個公共頁面a也進行了整改,過一會你同事改完,提交x版本并合并push到了master遠程分支上面。此時我們在dev分支完成一次開發提交了v2版本,產品經理過來說,需求有變更,要再做修改,然后我們又以v2的基礎上在做修改,并提交為v3版本。過一會測試又提了一個需求建議。我們接著以當前dev分支v3版本為基礎做好了整改并commit一個v4版本。到此我們本地假設對頁面a修改了三次。同事修改了一次,并push到了遠程master上面。那么我們對master分支進行合并到時候就會產生沖突。
  • 簡單來講就是。遠程分支 master 對文件a進行了1次 commit ,而別的分支dev對文件A進行了3次commit,但是本地分支dev提交的n次 commit都與master分支的1次commit有沖突,

8.2.1 使用 git rebase 解決沖突

 
$ git fetch  // 更新本地存儲的遠程倉庫的分支引用
$ git rebase origin/master // 拉去遠程分支master中的代碼與當前分支合并且變基
// 此時我們會產生第一次沖突,為當前dev分支版本v2中的a頁面與遠程分支master中的a頁面沖突。解決后,根據提示進行 
$ git add .
$ git rebase continue // 繼續進行合并
// 此時我們會產生第二次沖突,為當前dev分支版本v3中的a頁面與遠程分支master中的a頁面沖突。解決后,根據提示進行 
$ git add .
$ git rebase continue // 繼續進行合并
// 此時我們會產生第三次沖突,為當前dev分支版本v4中的a頁面與遠程分支master中的a頁面沖突。解決后,根據提示進行 
$ git add .
$ git rebase continue // 繼續進行合并
// 至此我們使用 rebase 變基完成 可以根據產品需求push到遠程dev分支
$ git log --graph --oneline // 查看log點線圖
// 符號解釋:
* 表示一個commit, 注意不要管*在哪一條主線上 
| 表示分支前進 
/ 表示分叉 
\ 表示合入

8.3 結論

1、不會因為像使用 merge 時合代碼時遇到沖突產生新的提交記錄

2、用 merge 只需要解決一次沖突即,簡單粗暴,而用 rebase 的時候 ,需要依次解決每次的沖突,才可以提交。

3、使用 rebase 提交記錄不會分叉,一條線干凈整潔

4、沖突解決完之后,使用 git add 來標記沖突已解決,最后執行git rebase --continue繼續。如果中間遇到某個補丁不需要應用,可以用下面命令忽略:git rebase --skip

5、如果想回到 rebase 執行之前的狀態,可以執行:git rebase --abort

8.4 場景三

  1. 你開發的一個需求產品反復更改,導致你的commit記錄多次重復功能點
  2. 在日常開發中,難免有重復的commit提交記錄.這時候我們想優化一下提交記錄該如何做呢
  • 當前分支狀態節點如下圖所示:

使用git rebase 進行commit記錄合并操作
 
 $ git rebase -i HEAD~x  // i(interactive)交互,HEAD~x 代表要合并到距離HEAD最近的幾個歷史提交,如 HEAD~3就是歷史的前3個提交.$ git log --graph --oneline // 查看log點線圖// 符號解釋:* 表示一個commit, 注意不要管*在哪一條主線上 | 表示分支前進 / 表示分叉 \ 表示合入
  • 這里我們使用git rebase -i HEAD~3,此時我們會出現如下界面,我們進行簡單設置

? 此時我們會產生一條新的提交記錄,并選擇填寫提交相關信息,并刪減掉合并掉的提交記錄?

  • 到此我們的合并已結束。

8.4.1 結論

  1. 合并了冗余的提交記錄,并產生了一條新的提交記錄
  2. 使提交記錄看起來更整潔,也方便同事查閱

九、總結

  • 我們發現分享 rebase 全文都是圍繞 優化分支提交記錄 來舉例子介紹該命令,我個人覺得這也就是該命令的核心之處。
  • 在學習 rebase 之前我日常使用的基本都是 merge 導致 commit 記錄過于混亂

參考文獻

  • # 從git log 點線圖(graph)看merge和rebase操作

  • # 從git rebase的常見沖突及解決辦法

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

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

相關文章

小愛音箱接入大模型DeepSeek及TTS

簡介 相信看過鋼鐵俠的朋友們,都夢想擁有一個像賈維斯這樣全能的人工智能管家。而現在隨著AI的發展,這個愿景將隨我們越來越近。現階段,我們可以將小愛音箱接入DeepSeek,將其從“人工智障”進化成上知天文,下懂地理的半…

軟件架構評估利器:質量效用樹全解析

質量效用樹是軟件架構評估中的一種重要工具,它有助于系統地分析和評估軟件架構在滿足各種質量屬性方面的表現。以下是關于質量效用樹的詳細介紹: 一、定義與作用 質量效用樹是一種以樹形結構來表示軟件質量屬性及其相關效用的模型。它將軟件的質量目標…

[IEEE TIP 2024](cv即插即用模塊分享)IdeNet信息增強模塊 性能提升必備!

論文地址:https://ieeexplore.ieee.org/document/10661228 代碼地址:https://github.com/whyandbecause/IdeNet 什么是偽裝目標檢測(COD)? 偽裝目標檢測(Camouflaged Object Detection, COD)是…

biblatex 的 Biber 警告??:tex文件運行無法生成參考文獻和目錄

原因??:使用了 biblatex 管理參考文獻,但未運行 biber 生成參考文獻數據。 ??解決??:更新 LaTeX Workshop 配置 修改你的 settings.json,添加 biber 工具并更新編譯流程: {"latex-workshop.latex.tools&…

thingsboard3.9.1編譯問題處理

問題1: [ERROR] Failed to execute goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke (default) on project http: Execution default of goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke failed: Plugin org.thingsboard:gradle-maven-plugin:1.…

深入淺出Redis 緩存使用問題 | 長文分享

目錄 數據一致性 先更新緩存,后更新數據庫【一般不考慮】 先更新數據庫,再更新緩存【一般不考慮】 先刪除緩存,后更新數據庫 先更新數據庫,后刪除緩存【推薦】 怎么選擇這些方案?采用哪種合適? 緩存…

Express中間件(Middleware)詳解:從零開始掌握(2)

1. 請求耗時中間件的增強版 問題:原版只能記錄到控制臺,如何記錄到文件? 改進點: 使用process.hrtime()是什么?獲取更高精度的時間支持將日志寫入文件記錄更多信息(IP地址、狀態碼)工廠函數模式使中間件可配置 con…

如何設置Ubuntu服務器版防火墻

在Ubuntu服務器中,默認使用 ufw(Uncomplicated Firewall)作為防火墻管理工具。它是對iptables的簡化封裝,適合快速配置防火墻規則。以下是設置防火墻的詳細步驟: 1. 安裝與啟用 ufw 安裝(通常已預裝&…

暢游Diffusion數字人(23):字節最新表情+動作模仿視頻生成DreamActor-M1

暢游Diffusion數字人(0):專欄文章導航 前言:之前有很多動作模仿或者表情模仿的工作,但是如果要在實際使用中進行電影級的復刻工作,僅僅表情或動作模仿還不夠,需要表情和動作一起模仿。最近字節跳動提出了一個表情+動作模仿視頻生成DreamActor-M1。 目錄 貢獻概述 核心動…

模型開發中的微調是干什么

在模型開發中,微調(Fine-tuning) 是指利用預訓練模型(Pre-trained Model)的參數作為初始值,在特定任務或數據集上進一步調整模型參數的過程。它是遷移學習(Transfer Learning)的核心…

vue3中,element-plus中el-select隱藏下拉箭頭

需求&#xff1a;el-select需要隱藏下拉箭頭 <el-select v-model"apply.dataType" readonly><el-option :key"1" label"樣品檢相同項目" :value"1" /><el-option :key"2" label"樣品檢不同項目" :…

英語學習4.9

cordial 形容詞&#xff1a; 熱情友好的&#xff0c;誠懇的 表示一個人態度溫和、親切&#xff0c;給人溫暖和善的感覺。 令人愉快的&#xff0c;和睦的 形容關系融洽、氛圍和諧。 例句??&#xff1a; The two leaders had a ??cordial?? but formal discussion. &am…

類似東郊到家的上門按摩預約服務系統小程序APP源碼全開源

&#x1f525; 為什么上門按摩正在席卷全國&#xff1f; 萬億藍海市場爆發 2024年中國按摩市場規模突破8000億&#xff0c;上門服務增速達65% 90后成消費主力&#xff0c;**72%**白領每月至少使用1次上門按摩&#xff08;數據來源&#xff1a;艾媒咨詢&#xff09; 傳統痛點…

驅動學習專欄--寫在前面

此專欄基于正點原子的文檔【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.81 開發板為luckfox的rv1106開發板&#xff0c;之前參加過一個CM1相機的開源項目&#xff0c;與其吃灰不如作為一個學習的工具來發揮余熱 所以文檔中的一些東西需要對應的在rv1106平臺上做修改&#xff…

第二篇:Python函數與模塊化編程深度教程

第一章:函數定義與調用 1.1 函數基礎架構 1.1.1 函數定義規范 函數定義采用def關鍵字,遵循PEP8命名規范(小寫字母+下劃線) def calculate_circle_area(radius):"""計算圓的面積""" # 文檔字符串PI = 3.14159return PI * radius ?**? …

3.1.3.3 Spring Boot使用Filter組件

在Spring Boot中使用Filter組件&#xff0c;可以通過創建一個類實現Filter接口&#xff0c;并使用Component注解將其標記為Spring組件。通過Order注解可以指定過濾器的執行順序&#xff0c;數字越小優先級越高。在LoggingFilter類中&#xff0c;重寫init、doFilter和destroy方法…

目標追蹤Hyperspectral Adapter for Object Tracking based on Hyperspectral Video

論文作者&#xff1a;Long Gao,Yunhe Zhang,Langkun Chen,Yan Jiang,Weiying Xie,Yunsong Li 作者單位&#xff1a;Xidian University;the University of Sheffield 論文鏈接&#xff1a;http://arxiv.org/abs/2503.22199v1 內容簡介&#xff1a; 1&#xff09;方向&#x…

Python及C++中的排序

一、Python中的排序 &#xff08;一&#xff09;內置排序函數sorted() 基本用法 sorted()函數可以對所有可迭代對象進行排序操作&#xff0c;返回一個新的列表&#xff0c;原列表不會被修改。例如&#xff0c;對于一個簡單的數字列表nums [3, 1, 4, 1, 5, 9, 2, 6]&#xff…

詳解springcloud nacos使用

1.nacos server安裝 下載 Nacos Server 2.5.1 https://nacos.io/download/nacos-server/?spm5238cd80.2ef5001f.0.0.3f613b7clM2t6D 部署文檔&#xff1a;https://nacos.io/docs/latest/manual/admin/deployment/deployment-standalone/?spm5238cd80.6a33be36.0.0.25b41e5d…

第三篇:Python數據結構深度解析與工程實踐

第一章:列表與字典 1.1 列表的工程級應用 1.1.1 動態數組實現機制 Python列表底層采用動態數組結構,初始分配8個元素空間,當空間不足時按0,4,8,16,25,35...的公式擴容,每次擴容增加約12.5%的容量 通過sys模塊可驗證擴容過程: import sys lst = [] prev_size = 0 for …