【Git教程】(七)變基與揀取 —— 變基操作的概念、適用場景及其實現方式,揀取操作的實現 ~

Git教程 · 變基與揀取

  • 1?? 工作原理:復制提交
  • 2?? 避免“鉆石鏈”
  • 3?? 什么情況下會遇到沖突
  • 4?? 移植分支
  • 5?? 執行變基后原提交的情況
  • 6?? 提交的原件與副本存在于同一版本庫中所帶來的問題
  • 7?? 撿取
  • 🌾 總結

在這里插入圖片描述

通常, 一段提交歷史中往往都存在著許多雜亂的分支。Git 可以盡可能地幫助我們理順這些歷史記錄。這里會用到的最重要的工具當然就是 rebase 命令了,它可以可以將某一次提交在提交圖上產生的影響從一個節點轉移到另一節點。

我們可以用該命令做以下幾件事情。

  • 如果你不小心在錯誤的分支上執行了一次提交。例如你可能將一次 bug 修復提交到了 當前開發線(即 master 分支)上。
  • 當多個開發者在致力于開發同一軟件時,他們會頻繁地整合自己的修改。如果不進行 變基,他們可能會創建出一部帶有多個小分支和分岔的歷史(我們稱之為鉆石鏈)。 通過 rebase 命令,我們可以將其改造成一部較為平滑的線性歷史。

1?? 工作原理:復制提交

變基操作的工作原理很簡單: Git 會讓我們想要移動的提交序列在目標分支上按照相同的順序重新再現一遍。這就相當于我們為各個原提交做了個副本,它們擁有相同的修改集、同一作者、日期以及注釋信息。

請注意:乍看之下,好像 Git 只是在執行變基重操作時移動了相關提交。但事實上,這 些“被轉移”的提交往往都是一些擁有不同提交散列值的新提交。了解這一情況非常重要,
尤其是在提交已經從原分支已經擴散到其子分支時。

由于新提交會被記錄在提交圖中的不同位置,所以當然有可能會引發沖突,因為其原本的修改未必適合當前的情況。對于這類修改,我們必須要通過手動來解決合并沖突。


2?? 避免“鉆石鏈”


在這里插入圖片描述

如果為同一軟件工作的若干個開發者頻繁地歸并各種修改,該項目所建立起來的提交歷史看起來就會像一條鉆石鏈。這時候我們可以利用變基操作將其整理成一部內容等效,但線性發展的歷史。

下面,我們通過下圖中的具體例子來看看變基操作的具體過程。如你所見,從 master 分支上岔出了一個名為 feature-a 的分支,其中包含了C 和 D 兩個提交。同時, master 分支也得到了進一步的開發,于是多出了一個提交B。

在這里插入圖片描述現在,你可以通過 git merge master 命令來合并這些修改,然后再用 rebase 命令理順其
歷史紀錄。該命令需要一個參數,以說明我們要將活動分支上的最新修改納入哪一個分支。

> #Branch "feature-a" is active
> git rebase master

在收到這個命令之后,Git就會去做以下事情,以便將活動分支(feature-a)融合到 master
分支上。

  • 確認涉及到哪些提交:Git會確認是要將活動分支 feature-a 上的哪一些目前不在目標分支 ( master) 上,在這里就是提交C 和 D。
  • 確認目標位置:Git 會確認目標提交的位置,該提交就是 master 上 feature-a 將要執行變基操作地方,在這里就是提交B。
  • 復制提交:以目標提交為基礎重演上述提交中的所有修改,并相應創建提交 C’ 和 D’。
  • 將活動分支重置:活動分支將被移動到上述被復制提交的頂部,在這里就是提交D’。

然而在很多情況下,我們可能不會直接去調用 rebase 命令。相反,我們通常會用 pull 命令加上 --rebase 選項來對遠程版本庫中的修改進行變基處理。

注意:舊提交 C 和 D 偶爾還會留在版本庫中,雖然它們已經不再直接可見,因為 feature-a 分支現在已經指向了 D’ 。但是,我們依然還是可以通過散列值對C 和 D 進行訪問。 只有在用 gc 命令執行垃圾回收之后,它們才會真正從版本庫中消失。


3?? 什么情況下會遇到沖突

merge 命令一樣,rebase 命令也會在相關修改不匹配的時候以沖突的形式被終止。 但它們之間有個重要的區別:即在合并過程中,我們得到的是兩個分支合體之后的單一提交結果。而在變基過程中,我們是在依次執行重復的若干次提交。如果一切順利,其最后一次所提交的內容應該會與其執行 merge 命令時的結果相同,因為 Git 在這兩個命令中采用 了相同的沖突解決算法。但如果 rebase 命令在執行過程中遇到沖突情況,該命令進程就會被打斷,相關文件中也會出現沖突標志。我們需要先手動或通過合并工具對文件進行清理, 并重新將它們添加到暫存區中。然后再執行 rebase 命令加 --continue 選項,從該點繼續之前的進程。

> git add foo.txt
> git add bar.txt
> git rebase --continue

當然,我們也可以用 --abort 選項取消這次的 rebase 命令,或者用 --skip 選項跳過引起沖突的提交。這樣該次提交就被直接忽略,其中的修改將不會出現在新分支上。

需要特別注意,與合并操作不同的是,在被中斷變基作業的那些提交副本中可能已經有一部分被執行變基操作了。


4?? 移植分支

有時候,在已經創建了一個分支,并完成其首次提交的情況下,我們也可以通過 --onto
選項將該分支移植到提交圖中的另一個位置上。
在下面的例子中, feature-a 分支被移植到了release1 分支上。

在這里插入圖片描述

> #Branch "feature-a" is active
> git rebase master --onto release1

在這里, rebase 命令的第一個參數所指定的是原分支(即這里的 master 分支)。然后,
Git 就會去確認活動分支(即 feature-a) 上所有不屬于原分支的所有提交(在這里就是提交E 和 F) 。 然后通過--onto 選項將這些提交拷貝到指定位置上(即這里的 release1 分支)。

某一分支已經被移動到了提交圖中的另一位置上。

  1. 在必要情況下,我們可以切換到待移動的分支上
    git checkout the-branch
  2. 確定原位置
    即原分支,相關分支是從這里被移出去的。Git會將其中所有不屬于原分支的提交移出來。
  3. 檢查所要移動的內容
    提前對可能會受到影響的提交做個相應的檢查是一個明智的選擇,因為一個變基操作錯誤可能會給版本庫帶來一個非常混亂的局面。
    git log origin..the-branch
  4. 確定目標位置
    選擇一個分支來充當被移動分支執行變基操作的目標位置。
  5. 執行變基操作
    git rebase origin --onto target

注意: rebase 命令中的原位置并不一定非得是一個分支。它也可以是任何提交。


5?? 執行變基后原提交的情況

這些提交會在變基過程中被復制。但其原件(即本例中的提交C 和 D) 依然還可以通過散列值來進行訪問,如圖所示。通常情況下,當沒有分支可以進一步從這些提交中繼續發展時,下一輪垃圾收集過程(通過 gc 命令)就會直接將它們從版本庫中刪除。

在這里插入圖片描述


6?? 提交的原件與副本存在于同一版本庫中所帶來的問題

重復容易造成版本庫中的混亂。它們可以很容易引起誤解,讓人以為某段既定的代碼修 改包含在哪一分支上,不包含在哪一分支上。通常來說,git log HEAD..a-branch 顯示的是在a-branch 上而不在當前分支的那些提交。如果存在重復的話,當前分支也可能已經包含了該代碼的修改。這會增加審查以及質量保證方面的復雜性。

除此之外,這種重復還有可能會給我們稍后對帶有重復提交的分支與帶有原始提交的分 支之間的合并帶來麻煩。在最好的情況下,Git會自己識別出同樣的修改出現了不止一次,并對其只采用一次。而在最壞的情況下,如果該重復提交被當作沖突來處理, Git 是無法檢測到的,然后它會試圖多次采用這一修改。結果就會產生一些令用戶意外的沖突。

一旦我們將某次提交傳遞給了一個遠程版本庫,就不應該再用 rebase 命令來移動該提交了。否則,由于其他開發者可能會在其原作上繼續他們的工作,這在將來再次合并修改的時候一定會帶來問題。


7?? 撿取

接下來,我們再來介紹另一種復制提交的方式: cherry-pick 命令。我們可以用它來指定自己需要的提交,Git 會為此創建一次新的提交,該提交中會擁有相同的修改集與當前分支中的元數據。

> git cherry-pick 23ec70f6b0

那么對于撿取操作,我們應該了解哪些事情呢?

  • cherry-pick 不會參考歷史紀錄。因而 mergerebase 還可以被正確地識別成文件的 重命名與移動操作, cherry-pick 則不能。
  • 撿取操作有時候會被用來將一些小bug 的修復傳遞到各種不同的發行版中。
  • 該操作的另一種應用是從即將刪除的分支中轉移出有用的提交。
  • 警告:撿取操作也有可能會引發我們之前所說的重復提交問題。

🌾 總結

  • 變基操作:Git 能將提交復制到提交圖中的其他地方。盡管其中的修改與元數據(作者、日期)將保持不變,但該復制結果會有一個新的提交散列值。你可以通過rebase 命令以多種方式對提交圖進行重構。
  • 只適用于推送之前:通常情況下,我們應該只對那些還未被傳遞給其他版本庫的提交試用rebase 命令。否則,這樣做可能給日后帶來非常麻煩的合并沖突。
  • 理順歷史:如果我們在并行式開發的過程中使用merge 命令解決了其中的沖突,就會得到一部經歷了多次分岔與合并的歷史。如果用rebase 來代替 merge, 我們就會得到一部呈線性發展的歷史。
  • 變基過程中的沖突:Git 會逐段逐段重演被復制的提交。如果因為某些修改與工作區內容不相符而引發了沖突,變基的進程就會被中斷。與執行 merge 命令的過程一樣, 開發者可以先手動解決掉沖突,再繼續變基的過程。
  • rebase --onto :通過該選項,我們可以將某一分支移動到提交圖中另一個完全不同的位置。


? 溫習回顧上一篇(點擊跳轉)
《【Git教程】(六)分支合并 —— 合并過程,各類合并沖突及解決思路 ~》

? 繼續閱讀下一篇(點擊跳轉)
《》

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

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

相關文章

編寫科技項目驗收測試報告需要注意什么?第三方驗收測試多少錢?

科技項目驗收測試是一個非常重要的環節,它對于確保科技項目的質量和可用性起著至關重要的作用。在項目完成后,進行科技項目驗收測試可以評估項目的功能、性能和可靠性等方面,并生成科技項目驗收測試報告,以提供給項目的相關方參考…

第十六屆“中關村青聯杯”全國研究生數學建模競賽-E題:全球變暖氣候預測分析(續)

目錄 五、問題二:模型的建立與求解 5.1 問題分析 5.2 數據獲取及處理 5.2.1 數據獲取

git commit 的規范

今天在一個項目中提交git時報了下面的錯誤:subject may not be empty [subject-empty] type may not be empty [type-empty],上網查閱了一些資料,發現這種一種規范約束,用下面的命令我又重新提交了一次 git commit -m "feat…

SpringFramework實戰指南(七)

SpringFramework實戰指南(七) 4.5 三種配置方式總結4.5.1 XML方式配置總結4.5.2 XML+注解方式配置總結4.5.3 完全注解方式配置總結4.6 整合Spring5-Test5搭建測試環境4.5 三種配置方式總結 4.5.1 XML方式配置總結 所有內容寫到xml格式配置文件中聲明bean通過<bean標簽<…

Docker技術概論(2):Docker環境的搭建

Docker技術概論&#xff08;2&#xff09; Docker環境的搭建 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blo…

自動采集API壁紙系統源碼自適應手機端

HTML5響應式自動采集API壁紙系統源碼自適應手機端 瀑布流加載 源碼下載&#xff1a;https://www.qqmu.com/2303.html

InnoDB備份與恢復篇(1)-InnoDB的備份與還原策略

InnoDB數據庫的備份與還原策略 MySQL是一種廣泛使用的關系型數據庫管理系統&#xff0c;而InnoDB是MySQL的默認存儲引擎之一。在生產環境中&#xff0c;對于數據庫的備份和還原至關重要&#xff0c;以確保數據的安全性和可靠性。本文將介紹MySQL數據庫InnoDB引擎的備份與還原策…

七、有序的列表

描述 創建一個依次包含字符串P、y、t、h、o和n的列表my_list&#xff0c;先使用sorted函數對列表my_list進行臨時排序&#xff0c;第一行輸出排序后的完整列表&#xff0c;第二行輸出原始的列表。再使用sort函數對列表my_list進行降序排序&#xff0c;第三行輸出排序后完整的列…

yolov8漲點技巧,添加SwinTransformer注意力機制,提升目標檢測效果

目錄 摘要 SwinTransformer原理 代碼實現 YOLOv8詳細添加步驟 ymal文件內容 one_swinTrans three_swinTrans 啟動命令 完整代碼分享 摘要 Swin Transformer通過引入創新的分層注意力機制展現了其架構的獨特性&#xff0c;該機制通過將注意力區域劃分為塊并在這些塊內執…

小白的matlab簡單應用

基本概念 1、數組array 數組是一個更通用的數據結構&#xff0c;可以是一維、二維或多維的。 一維數組通常被稱為向量。 二維數組可以被視為矩陣。 多維數組可以用來表示更高維度的數據&#xff0c;例如三維數組可以表示一系列的矩陣。 用過的函數 20240229 1、讀取excel文件…

python_pyecharts_堆積圖

from pyecharts.charts import Bar from pyecharts import options as opts # 構建數據 x_data ["A", "B", "C", "D", "E"] y_data [10, 20, 30, 40, 50] z_data [5, 15, 25, 35, 45] # 創建堆積柱狀圖Bar實例 bar Bar(…

進階了解C++(4)——多態

在上篇文章中&#xff0c;簡單的介紹了多態中的概念以及其相關原理。本文將針對多態中其他的概念進一步進行介紹&#xff0c;并且更加深入的介紹關于多態的相關原理。 目錄 1. 抽象類&#xff1a; 2. 再談虛表&#xff1a; 3. 多繼承中的虛函數表&#xff1a; 1. 抽象類&am…

MySQL 用戶賬號遷移

文章目錄 前言1. 工具安裝1.1 下載安裝包1.2 編譯安裝 2. 用戶遷移后記 前言 有一個典型的使用場景&#xff0c;就是 RDS 下云大多數都是通過 DTS 進行數據傳輸的&#xff0c;用戶是不會同步到自建數據庫的。需要運維人員在自建數據庫重新創建用戶&#xff0c;如果用戶數量很多…

基于springboot+vue的在線考試與學習交流平臺

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

中小型水庫安全監測運營解決方案,筑牢水庫安全防線

我國水庫大壩具有“六多”的特點。第一&#xff0c;總量多。我國現有水庫9.8萬座&#xff0c;是世界上水庫大壩最多的國家。第二&#xff0c;小水庫多。我國現有水庫中95%的水庫是小型水庫。第三&#xff0c;病險水庫多。 目前&#xff0c;在我國水庫管理中&#xff0c;部分地方…

供應鏈|NUS覃含章MS論文解讀:數據驅動下聯合定價和庫存控制的近似方法 (二)

編者按 本次解讀的文章發表于 Management Science&#xff0c;原文信息&#xff1a;Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在數…

深度神經網絡聯結主義的本質

一、介紹 在新興的人工智能 (AI) 領域&#xff0c;深度神經網絡 (DNN) 是一項里程碑式的成就&#xff0c;突破了機器學習、模式識別和認知模擬的界限。這一技術奇跡的核心是一個與認知科學本身一樣古老的思想&#xff1a;聯結主義。本文深入探討了聯結主義的基本原理&#xff0…

c# this關鍵字

c#this關鍵字 1. 代表當前類的對象 class Father {public int Age { get; set; }public string Name { get; set; }public Father(int age, string name){this.Age age;this.Name name;}public void Test(){Console.WriteLine($"name:{this.Name },age:{this.Age }&qu…

實例:NX二次開發抽取平面以及標準柱面中心線

一、概述 最近體驗許多外掛&#xff0c;包括胡波外掛、星空外掛及模圣等都有抽取面的中心線&#xff0c;由于剛剛學習&#xff0c;我嘗試看看能不能做出來&#xff0c;本博客代碼沒有封裝函數&#xff0c;代碼有待改進&#xff0c;但基本可以實現相應的功能。 二、案例實現的功…

【web APIs】3、(學習筆記)有案例!

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、概念其他事件頁面加載事件元素滾動事件頁面尺寸事件 元素尺寸與位置 二、案例舉例電梯導航 前言 掌握阻止事件冒泡的方法理解事件委托的實現原理 一、概念…