git rebase使用教程 以及和merge的區別

Merge和Rebase概念概述

rebase 和 merge 相似,但又不完全相同,本質上都是用來合并分支的命令,區別如下

  1. merge合并分支會多出一條merge commit記錄,而rebase不會
  2. merge的提交樹是非線性的,會有分叉,而rebase的提交樹是線性的(通過重寫提交歷史),它是一條直線;
  3. rebase可以將多個commit合并,而merge不支持這個功能
  4. merge合并操作很友好,因為它沒有破壞性。現存的分支歷史不會發生什么改變,而rebase提交是線性的,雖然便于理解提交歷史,卻需要付出兩種代價:安全性和可追溯性;

1、分支描述

請考慮這個場景,當你開始在一個專有的feature分支開發新的功能時,另一位團隊成員更新了main分支的內容。這將會造成一個分叉的提交歷史,接下來,我們將用merge和rebase來合并分支,并解釋它們之間的區別;

2、使用merge合并

最簡單的方法就是把main分支合并到feature分支:

# 先切換到 feature 分支
git checkout feature
# 將main分支的內容合并到 feature 分支
git merge main

或者用下面這樣的單行命令:

git merge feature main

這會在feature分支中創建一個合并提交,這次提交會連結兩個分支的提交歷史,在分支圖示結構中看起來像下面這樣:

合并操作很友好,因為它沒有破壞性。現存的分支歷史不會發生什么改變。只是新增了一個commit記錄(綠色帶*號的就是合并記錄);

但是另一方面來說,這也意味著每當feature分支需要應用上游分支的更改時,都會在提交歷史上增加一個無關的提交歷史。如果main分支的更新非常活躍,這種操作也會對功能分支的提交歷史產生相當程度的污染。雖然通過復雜的git log命令可以減輕這種提交歷史的混亂現狀,但仍然會讓其他開發者對于提交歷史感到費解。

3、使用rebase合并

為了替代merge操作,你也可以把feature分支的提交歷史rebase到main分支的提交歷史頂端:

# 先切換到 feature 分支
git checkout feature
# 將main分支的內容合并到 feature 分支
git rebase main

這些操作會把feature分支的起始歷史放到main分支的最后一次提交之上,也達成了使用main分支中新代碼的目的。但是,相對于merge操作中新建一個合并提交,rebase操作會通過為原始分支的每次提交創建全新的提交,從而重寫原始分支的提交歷史(綠色帶*號部分就是被重寫提交歷史)。

使用rebase操作的最大好處在于你可以讓項目提交歷史變得非常干凈整潔。首先,它消除了git merge操作所需創建的沒有必要的合并提交。其次,正如上圖所示,rebase會造就一個線性的項目提交歷史——也就是說你可以從feature分支的頂部開始向下查找到分支的起始點,而不會碰到任何歷史分叉。這在使用git log,git bisect以及gitk等命令時更簡單。

不過為了獲得這種便于理解的提交歷史,卻需要付出兩種代價:安全性和可追溯性。如果不能遵循rebase的黃金法則,重寫項目提交歷史會為協作工作流程帶來潛在的災難性后果。再次,rebase操作丟失了合并提交能夠提供的上下文信息——所以你就無法知道功能分支是什么時候應用了上游分支的變更。

可交互式rebase (將多個commit合并為一個)

可交互式rebase讓你在把變更提交給其他分支之前有機會對提交記錄進行修改。這甚至比自動rebase操作更強大,畢竟它提供了對于分支提交歷史的完全掌控力。通常來說這一操作的使用場景在于合并功能分支到main分支之前,對于功能分支雜亂的提交記錄進行整理。

進行可交互式rebase操作,需要向git rebase命令傳遞i選項參數

git checkout feature
git rebase -i main

執行以上命令會打開一個文本編輯器,其中內容為分支中需要移動的所有提交列表:

pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

上面這樣的列表正表示了分支被rebase之后其歷史的長相。通過修改pick命令或者對提交歷史進行重新排序,你可以讓最終的提交歷史變成任何你希望的樣子。比如說,如果第二次提交修復了第一次提交的什么BUG,你可以使用fixup命令替代pick來把兩次提交壓縮在一起。

pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
指令說明
  • p,pick <提交>: 保留當前的提交內容。
  • r,reword <提交>: 保留當前的提交內容。,但修改提交說明
  • e,edit <提交>: 保留當前的提交內容,并允許你修改該提交的文件內容
  • s,squash <提交> : 將當前提交與前一個提交合并,并將它們合并為一個提交,允許你合并提交信息。
  • f,fixup <提交>: 與 squash 類似,但將當前提交合并到前一個提交中,并丟棄當前提交的提交信息。
  • x,exec <命令>: 執行 shell 命令,可以在 rebase 過程中執行自定義操作
  • b,break : 在當前提交之后創建一個新的提交點,將當前提交內容分成兩個獨立的提交。 (使用git rebase–continue’繼續變基)
  • d,drop <提交>: 丟棄當前的提交內容,不保留該提交。
  • l,label

當你保存并關閉這個文件之后,Git會根據你的調改結果執行rebase操作,根據上面的例子項目歷史會變成下圖這樣:

通過清除那些并不重要的提交歷史可以讓項目整體的歷史更易讀易懂。這一點是git merge操作所無法提供的。

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

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

相關文章

React中的合成事件解釋和理解

什么是合成事件&#xff08;Synthetic event&#xff09;?它和原生事件有什么區別?解題思路:解釋合成事件&#xff0c;然后對比原生事件&#xff0c;然后再說他的優勢1.一致性 在 react里面&#xff0c;這個合成事件是非常重要的&#xff0c;因為它就是為了解決瀏覽器之間與事…

【Python系列】使用 memory_profiler 診斷 Flask 應用內存問題

博客目錄一、內存分析的重要性二、memory_profiler 基礎使用安裝與基本配置理解分析報告三、在 Flask 應用中使用 memory_profiler裝飾視圖函數使用 mprof 進行長期監控四、高級內存分析技巧精確測量代碼塊內存定期內存采樣結合 objgraph 分析對象引用五、常見內存問題及解決方…

vue3【組件封裝】超級表單 S-form.vue

最終效果 代碼實現 components/SUI/S-form.vue <script lang"ts" setup> import type { FormInstance } from "element-plus";// 使用索引簽名定義對象類型 type GenericObject {[key: string]: any; };const props defineProps<{Model?: Gen…

Android Studio Memory Monitor內存分析核心指標詳解

Depth、Native Size、Shallow Size、Retained Size 解析 一、指標定義與對比指標定義計算邏輯重要性Shallow Size對象自身實例占用的內存基本類型字段大小 引用指針 內存對齊對象的基礎內存成本Retained Size回收該對象可釋放的總內存量&#xff08;含所有依賴對象&#xff0…

vue中使用wavesurfer.js繪制波形圖和頻譜圖(支持.pcm)

新的實現方式&#xff1a;vue使用Canvas繪制頻譜圖 安裝wavesurfer.js npm install wavesurfer.js第一版&#xff1a; 組件特點&#xff1a; 一次性加載好所有的數據&#xff1b; <template><div class"audio-visualizer-container"><div class&…

go mod教程、go module

什么是go mod go mod 是go語言的包管理工具&#xff0c;類似java 的maven&#xff0c;go mod的出現可以告別goPath&#xff0c;使用go module來管理項目&#xff0c;有了go mod賬號就不需要非得把項目放到gopath/src目錄下了&#xff0c;你可以在磁盤的任何位置新建一個項目 go…

150-SWT-MCNN-BiGRU-Attention分類預測模型等!

150-SWT-MCNN-BiGRU-Attention分類預測模型!基于多尺度卷積神經網絡(MCNN)雙向長短期記憶網絡(BiGRU)注意力機制(Attention)的分類預測模型&#xff0c;matlab代碼&#xff0c;直接運行使用&#xff01;1、模型介紹&#xff1a;針對傳統方法在噪聲環境下診斷精度低的問題&#…

MySQL數據一致性與主從延遲深度解析:從內核機制到生產實踐

在高并發分布式系統中&#xff0c;數據一致性與復制延遲如同硬幣的兩面。本文深入剖析MySQL持久化機制與主從同步原理&#xff0c;并提供可落地的調優方案。一、數據持久化核心機制&#xff1a;雙日志協同 1. Redo Log&#xff1a;崩潰恢復的生命線刷新策略&#xff08;innodb_…

【I】題目解析

目錄 單選題 多選題 判斷題 單選題 1.reg[7:0]A; A2hFF;則A&#xff08;&#xff09; A.8b11111110 B.8b03 C.8b00000011 D.8b11111111 C 2hFF實際上等效于2位二進制2b11&#xff0c;賦值給8位寄存器A之后&#xff0c;低位賦值&#xff0c;高位補0 A8b00000011 AMD FPG…

《Foundation 面板:設計、功能與最佳實踐解析》

《Foundation 面板:設計、功能與最佳實踐解析》 引言 在當今數字化時代,用戶界面(UI)設計的重要性不言而喻。其中,Foundation 面板作為一種流行的前端框架,因其靈活性和高效性而被眾多開發者所青睞。本文將深入解析 Foundation 面板的設計理念、功能特點以及最佳實踐,…

React服務端渲染 Next 使用詳解

1. Next.js 概述 Next.js 是一個基于 React 的開源框架&#xff0c;專注于服務器端渲染&#xff08;SSR&#xff09;和靜態站點生成&#xff08;SSG&#xff09;&#xff0c;提供開箱即用的 SSR 功能&#xff0c;簡化 React 應用的開發與部署。 2. Next.js 的核心特性 SSR 支…

Deforum Stable Diffusion,輕松實現AI視頻生成自由!

摘要&#xff1a; 你是否曾被那些充滿想象力、畫面流暢的AI視頻所震撼&#xff1f;你是否也想親手創造出屬于自己的AI動畫&#xff1f;本文將為你提供一份“保姆級”的詳盡教程&#xff0c;從環境配置到參數調整&#xff0c;一步步帶你復現強大的Deforum Stable Diffusion模型&…

不同環境安裝配置redis

不同環境安裝配置redis windows 環境安裝redis redis所有下載地址 windows版本redis下載&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推薦使用&#xff09;https://github.com/MicrosoftArchive/redis/releases]官…

匯川Easy系列PLC算法系列(回溯法ST語言實現)

Easy系列PLC 3次多項式軌跡插補算法 Easy系列PLC 3次多項式軌跡插補算法(完整ST代碼)_plc連續插補算法-CSDN博客文章瀏覽閱讀122次。INbExecuteBOOLOFFOFF不保持1INrStartPosREAL0.0000000.000000不保持起始位置unit2INrEndPosREAL0.0000000.000000不保持結束位置unit3INrStar…

Linux C:構造數據類型

目錄 一、結構體&#xff08;struct&#xff09; 1.1類型定義 1.2 結構體變量定義 1.3 結構體元素初始化 1.4 結構體成員訪問 1.5 結構體的存儲&#xff08;內存對齊&#xff09; 1.6 結構體傳參 本文主要記錄了C語言中構造數據類型部分的內容&#xff0c;今天暫時只寫了…

Python:self

在Python面向對象編程中&#xff0c;self是一個指向類實例自身的引用參數&#xff1a;?1. 本質與作用??身份標識?&#xff1a;self是類實例化后對象的"身份證"&#xff0c;代表當前實例本身&#xff0c;用于區分不同實例的屬性和方法??自動傳遞?&#xff1a;調…

【SpringMVC】SpringMVC的概念、創建及相關配置

什么是SpringMVC 概述 中文翻譯版&#xff1a;Servlet 棧的 Web 應用 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java實現MVC的輕量級Web框架。 查看官方文檔&#xff1a;https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.h…

淺談存儲過程

問題引入 面試的時候有時候會問到知不知道存儲過程&#xff0c;用沒用過&#xff1f; 是什么 存儲過程&#xff08;Stored Procedure&#xff09;是在大型數據庫系統中&#xff0c;一組為了完成特定功能的SQL 語句集&#xff0c;它存儲在數據庫中&#xff0c;一次編譯后永久…

maven optional 功能詳解

前言 最近參與了一個項目,使用maven管理依賴.項目拆分了很多模塊.然后交個多個團隊各自開發.最后在一個項目骨架中,把各自的模塊引入進來,一起啟動. 后來隨著項目的深入.引入的jar包變多.發現 jar包太多,編譯太慢, 打包之后的war包非常大.這種情況就可以使用optional來優化什么…

Python基礎--Day04--流程控制語句

流程控制語句是計算機編程中用于控制程序執行流程的語句。它們允許根據條件來控制代碼的執行順序和邏輯&#xff0c;從而使程序能夠根據不同的情況做出不同的決策。流程控制實現了更復雜和靈活的編程邏輯。 順序語句 順序語句是按照編寫的順序依次執行程序中的代碼。代碼會按照…