【Git】--- 分支管理

?Welcome to 9ilk's Code World

? ? ? ?

(??? ? ???)?個人主頁:? ? ? ?9ilk

(??? ? ???)?文章專欄:? ? ?Git


? ?本篇博客我們來介紹Git的一個重要功能之一 ---- 分支。我們將講解關于分支的各種操作,以及如何幫助我們進行開發。


🏠 理解分支

假設你處于一個平行宇宙,主時間線里你按部就班的學者C++,OS,另一個時間線的里學著Java,到達某一個時間點時兩個時空合并,此時相當于你在一段時間掌握的技能增加了,這里平行時空2相當于是在當前分支基礎上創建一個新分支,到達某一個時間點,我們再將兩個分支合并

head與master

在版本回退里,每次提交,Git都會把他們串成一條時間線,這條時間線可以理解為是一個分支。截止到目前,我們只有一條時間線,在Git里,這個分支叫主分支,即master分支

再來理解一下,HEAD指針嚴格來說不是指向提交,而是指向mastermaster才是指向提交所以HEAD(默認)指向的是當前分支

每次提交,master分支都會向前移動一步,隨著你的不斷提交,master分支的線也越來越長,而HEAD只要一直指向master分支即可指向當前分支。通過查看當前的版本庫,我們也能清晰的觀察:拿到master分支,我們就能通過parent依次拿到該分支下之前的一個個提交。

🏠 創建、切換、合并分支

當我們創建本地倉庫時,Git會自動給我們創建master分支,如果我們想查看本地有哪些分支,我們可以使用 git branch 命令

  • * 表示當前正在master分支工作。
  • HEAD不僅可以指向master分支,也可以指向其他分支,其中被HEAD指向的分支就是我們當前的工作分支。

創建分支

git branch + 分支名

創建完一個新的分支之后,我們可以使用git branch驗證一下是否創建了新分支:

還可以在.git目錄樹上驗證:

由于我們創建dev分支是基于master分支創建的,所以創建出來之后會指向最近的一次提交:

時間線圖如下:

切換分支

我們之前說HEAD所指向分支為當前工作分支,那如何切換當前工作分支呢?我們可以使用命令git checkout + 分支名

git checkout + 分支名

使用git branch操作驗證下是否切換成功:

切換后的時間線如圖:

合并分支

由于當前dev分支只是剛基于master分支創建,合并沒什么意義,我們對dev分支做一次提交

修改ReadMe文件:

兩板斧提交:

zhuang@VM-8-14-ubuntu:~/gitcode$ git add ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git commit -m "md ReadMe"
[dev 3165a96] md ReadMe1 file changed, 2 insertions(+), 1 deletion(-)
zhuang@VM-8-14-ubuntu:~/gitcode$ git status
On branch dev
nothing to commit, working tree clean

此時我們切換到master分支觀察變化:

此時我們切換到dev分支:

為什么切換到master分支下我們沒有觀察到變化,而在dev分支上內容還在呢??

這是因為我們是在dev分支上提交的,而master分支此刻的提交點沒有變,即沒有在master分支上master進行提交,時間線不會延長,此時狀態如圖:

當切換到master分支時,HEAD指向了master,此時自然看不到提交。

此時如果我們想讓我們之前修改的信息能在master分支上能查看到,此時需要合并兩個分支,但是注意master合并dev,需要先切換到master,再合并

git checkout + 要合并到的分支
git merge + 要合并的分支

此時我們就能在master分支上查看到我們之前修改的信息了:

  • Fast-forward表示快進模式(快速提交),直接把master的指向指向dev的最新提交,合并起來很快

合并后的時間線圖如下:

合并之后如果我們在master分支下再進行一次提交會發生什么?

合并之后并不是指dev分支等同于master分支了,而是將dev時間線的各個版本與master分支進行合并,往后他們各自還是獨立的:

🏠 刪除分支

將master分支和dev分支合并完之后,dev的使命基本結束了,此時我們需要把它刪除,那怎么刪除一個分支呢?

git branch -d + 要刪除的分支名

注意:要刪除一個分支時,需要先切換到其他分支,否則會報錯

因為創建、合并和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全

🏠 合并沖突

合并分支不是說能隨便合并的,合并時也可能出現沖突:

假設master分支上已經有aaa on branch的提交,我們模擬剩下的內容:

(1)在dev分支上提交 ccc on branch

zhuang@VM-8-14-ubuntu:~/gitcode$ git checkout -b dev1
Switched to a new branch 'dev1'

補充選項git checkout的-b選項幫我們完成兩件事:先幫我們創建新分支,再切換到新分支上

zhuang@VM-8-14-ubuntu:~/gitcode$ vim ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git add ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git commit -m "bb ReadMe"
[dev1 700c7b6] bb ReadMe1 file changed, 1 insertion(+), 1 deletion(-)

(2)在master分支上提交ccc on branch

zhuang@VM-8-14-ubuntu:~/gitcode$ git checkout master
Switched to branch 'master'
zhuang@VM-8-14-ubuntu:~/gitcode$ vim ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git add ReadMe
zhuang@VM-8-14-ubuntu:~/gitcode$ git commit -m "cc ReadMe"
[master a5c1371] cc ReadMe1 file changed, 1 insertion(+), 1 deletion(-)

(3)合并分支

我們打開ReadMe文件查看沖突內容,Git會用<<<<<<<,=======, >>>>>>>來標記出不同分支的沖突內容:

此時我們需要自己決策,手動調整沖突代碼,并需要再次提交修正后的結果!

此時的時間線圖如下:

如果我們想查看分支的合并情況,也可以使用git log命令帶上 --graph? --abrev-commit選項

🏠 合并模式

Fast-forward 模式

這里我們創建新分支dev2,提交一次之后與master分支進行合并,我們git log看看結果:

在這種Fast forward模式下,刪除分支之后,查看分支歷史時,會丟掉分支信息,看不出來最新提交到底時merge進來的還是正常提交的。

no-ff模式

在合并沖突部分,我們也看到通過解決沖突問題,會再進??次新的提交,得到的最終狀態為:

那么這就不是 Fast forward 模式了,而是no-ff模式,這樣的好處是,從分?歷史上就可以看出分?信息。例如我們現在已經刪除了在合并沖突部分創建的 dev1 分?,但依舊能看到master其實是由其他分?合并得到。

Git?持我們強制禁? Fast forward 模式(帶上--no-ff選項),那么就會在merge時?成?個新的 commit ,這樣,從分?歷史上就可以看出分?信息:

在dev2分支上提交:

使用no-ff模式,此時需要一次新的提交,需要帶上-m選項:

用git log查看:

此時時間線圖如下:

🏠 分支策略

在實際開發中,我們應該按照幾個基本原則進行分支管理:

首先master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布
時,再把dev分支合并到master上,在master分支發布1.0版本;(類似王者榮耀更新版本);你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。所以,團隊合作的分支看起來就像這樣:

🏠 Bug分支

線上環境不是百分百穩定,master主分支也可能有bug,我們應該單獨創建一個專門修復master分支bug的分支再合并,不能直接在master分支上修改bug有可能改出一個更大bug

我們要模擬的場景如下:

(1)dev2分支正在開發(I am coding)

(2) 暫存dev2分支工作區內容

由于dev2分支開發時只是對工作區進行修改并未提交所以會影響master,此時我們可以使用git stash命令先將工作區內容暫存起來

此時我們發現在.git目錄下多了個stash分區:

注意 git stash命令只能存儲之前被追蹤管理過的文件內容

(3) 創建bug分支修改分支

假設bug為:

創建fix_bug分支修改bug提交之后然后與master分支合并:

(4)?修復完bug切回dev2分支繼續開發

git stash list展示stash里存了什么

git stash pop將stash內容放出來

我們將內容恢復然后在dev2分支上進行提交

此時我們注意到,bug修復的內容在dev2分支上沒有顯示,這是因為master分支目前最新的提交,是要領先于新建dev2時基于的master分支的提交的。

我們最終目的是讓master合并dev2分支,但是這樣是有風險的,這是因為在合并分支時可能會有沖突,而代碼沖突需要我們手動解決(在master分支上解決),我們無法保證對于沖突問題可以正確地一次性解決,實際開發中,代碼沖突不只一行兩行那么簡單,解決過程出錯難免,導致錯誤的代碼合并到master分支上。此時狀態為:

解決這個問題的一個好的建議就是:最好在自己的分支上(dev2)合并下master,再讓master去合并dev2,這樣做的目的是有沖突可以在本地分支解決并進行測試,而不影響master。此時的狀態為:

演示:

dev2合并master

再將dev2合并到master

最后刪除fix_bug和dev2

zhuang@VM-8-14-ubuntu:~/gitcode$ git branchdev2fix_bug
* master
zhuang@VM-8-14-ubuntu:~/gitcode$ git branch -d dev2 fix_bug
Deleted branch dev2 (was 1714a31).
Deleted branch fix_bug (was dffd15d).

🏠 強制刪除分支

我們之前git branch -d刪除分支的前提是merge,git認為只要你創建分支不能隨便刪,此時我們確定該分支可以刪,只需改選項-D表示強行刪除

git branch -D 分支名


總結分支相關操作:

1. 創建分支 : git branch

2. 切換分支 : git checout?

3. 創建 + 切換分支 : git checkout -b?

4. 合并分支 : git merge?

5. 刪除分支 : git branch -d?

6. 查看分支情況 : git log?--graph? --abrev-commit

7. no-ff模式合并 : git merge --no-ff -m "message"?

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

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

相關文章

純血鴻蒙:中國操作系統自主創新的里程碑

引言&#xff1a;破局者登場 2024 年 10 月&#xff0c;搭載純血鴻蒙操作系統&#xff08;HarmonyOS NEXT&#xff09;的華為 Mate 70 系列正式發布&#xff0c;首日預約量突破 330 萬。這場現象級熱度的背后&#xff0c;不僅是消費者對硬件創新的期待&#xff0c;更是中國科技…

二造考試的備考過程中如何保持良好的心態?

在二級造價師考試的備考過程中&#xff0c;保持良好的心態至關重要&#xff0c;以下是一些有效的方法&#xff1a; 樹立正確的考試觀念 )認識到二級造價師考試是職業生涯中的一個重要環節&#xff0c;但不是唯一的決定因素。把它看作是提升自己專業能力、豐富知識儲備的機會&am…

Vue3前端開發:組件化設計與狀態管理

Vue3前端開發&#xff1a;組件化設計與狀態管理 一、Vue3組件化設計 組件基本概念與特點 是一款流行的JavaScript框架&#xff0c;它支持組件化設計&#xff0c;這意味著我們可以將頁面分解成多個獨立的組件&#xff0c;每個組件負責一部分功能&#xff0c;通過組件的嵌套和復用…

動手學深度學習11.9. Adadelta-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記&#xff0c;以及對課后練習的一些思考&#xff0c;自留回顧&#xff0c;也供同學之人交流參考。 本節課程地址&#xff1a;72 優化算法【動手學深度學習v2】_嗶哩嗶哩_bilibili 本節教材地址&#xff1a;11.9. Adadelta —…

Android Audio基礎(13)——audiomixer

在 Android 平臺上&#xff0c;音頻混合器 AudioMixer 主要用在 AudioFlinger 里&#xff0c;將多路音頻源數據混音&#xff08;包括混音、音量處理、重采樣及處理聲道等&#xff09;。位于 framework 的音頻處理模庫 libaudioprocessing&#xff08;frameworks/av/media/libau…

【React】使用Swiper報錯`Swiper` needs at least one child

問題 聊天頁面的表情面板&#xff0c;滑動效果使用了ant design mobile的Swiper。 原代碼中&#xff0c;Swiper 組件在 isShow 為 false 時渲染的是 <></>&#xff08;空元素&#xff09;&#xff0c;控制臺警告Swiper needs at least one child&#xff0c;Swip…

Matlab教程001:軟件介紹和界面使用

1.1 軟件介紹 1.1.1 Matlab的介紹 MATLAB&#xff08;MATrix LABoratory&#xff09;是一款由 MathWorks 公司開發的高級編程語言和交互式環境&#xff0c;廣泛用于 科學計算、數據分析、機器學習、工程建模、仿真和信號處理 等領域。 1.1.2 主要應用領域 數據分析與可視化…

藍橋杯算法實戰分享:算法進階之路與實戰技巧

引言 藍橋杯作為國內極具影響力的程序設計競賽&#xff0c;為眾多編程愛好者和專業人才提供了展示自我的舞臺。參與藍橋杯不僅能檢驗自身編程水平&#xff0c;還能拓寬技術視野&#xff0c;為未來職業發展積累寶貴經驗。本文將結合歷年真題與參賽經驗&#xff0c;全面分享藍橋…

Android Compose 層疊布局(ZStack、Surface)源碼深度剖析(十三)

Android Compose 層疊布局&#xff08;ZStack、Surface&#xff09;源碼深度剖析 一、引言 在 Android 應用開發領域&#xff0c;用戶界面&#xff08;UI&#xff09;的設計與實現一直是至關重要的環節。隨著技術的不斷演進&#xff0c;Android Compose 作為一種全新的聲明式…

MongoDB 面試備戰指南

MongoDB 面試備戰指南 一、基礎概念 1. MongoDB是什么類型的數據庫&#xff1f;和關系型數據庫有什么區別&#xff1f; 答案&#xff1a; MongoDB是文檔型NoSQL數據庫&#xff0c;核心區別&#xff1a; 數據模型&#xff1a;存儲JSON-like文檔&#xff08;動態schema&#xf…

毫米波雷達標定(2)

1. 前言 前面文章中介紹了產線上毫米波雷達的標定原理和流程,這篇文章則主要介紹其在線標定方法。相對于產線標定,在線標定具備使用自然場景而不是依賴特定標靶的優點,但因此其標定精度會相對差一點。在線標定一般應用于售出產品的維護場景,如果其標定結果精度可以滿足使用…

Linux fority source和__builtin_xxx

這段代碼是用于啟用和配置 GCC/Clang 的 Fortify Source 安全機制的預處理指令。Fortify Source 主要用于在編譯時增強對緩沖區溢出等內存安全問題的檢查。以下是對每一部分的詳細解釋&#xff1a; 1. 最外層條件編譯 # if CONFIG_FORTIFY_SOURCE > 0目的&#xff1a;檢查…

SQL GROUP BY 自定義排序規則

在 SQL 中&#xff0c;GROUP BY 子句用于將結果集按一個或多個列進行分組。默認情況下&#xff0c;GROUP BY 會按照列的自然順序&#xff08;如字母順序或數字順序&#xff09;進行排序。如果你需要按照自定義的排序規則對結果進行分組&#xff0c;可以使用 ORDER BY 子句結合 …

語言模型理論基礎-持續更新-思路清晰

1.預訓練 相似的任務A、B&#xff0c;任務A已經用大數據完成了訓練&#xff0c;得到模型A。 我們利用-特征提取模型的-“淺層參數通用”的特性&#xff0c;使用模型A的淺層參數&#xff0c;其他參數再通過任務B去訓練&#xff08;微調&#xff09;。 2.統計語言模型 通過條件…

ResNet與注意力機制:深度學習中的強強聯合

引言 在深度學習領域&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;一直是圖像處理任務的主流架構。然而&#xff0c;隨著網絡深度的增加&#xff0c;梯度消失和梯度爆炸問題逐漸顯現&#xff0c;限制了網絡的性能。為了解決這一問題&#xff0c;ResNet&#xff08;殘差…

【C++】——C++11新特性

目錄 前言 1.初始化列表 2.std::initializer_list 3.auto 4.decltype 5.nullptr 6.左值引用和右值引用 6.1右值引用的真面目 6.2左值引用和右值引用比較 6.3右值引用的意義 6.3.1移動構造 6.4萬能引用 6.5完美轉發——forward 結語 前言 C&#xff0c;這門在系統…

【C++網絡編程】第5篇:UDP與廣播通信

一、UDP協議核心特性 1. UDP vs TCP ?特性 ?UDP?TCP連接方式無連接面向連接&#xff08;三次握手&#xff09;可靠性不保證數據到達或順序可靠傳輸&#xff08;超時重傳、順序控制&#xff09;傳輸效率低延遲&#xff0c;高吞吐相對較低&#xff08;因握手和確認機制&…

MOSN(Modular Open Smart Network)是一款主要使用 Go 語言開發的云原生網絡代理平臺

前言 大家好&#xff0c;我是老馬。 sofastack 其實出來很久了&#xff0c;第一次應該是在 2022 年左右開始關注&#xff0c;但是一直沒有深入研究。 最近想學習一下 SOFA 對于生態的設計和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概覽 SOFABoot-01-螞蟻金服開源的 s…

微信小程序日常開發問題整理

微信小程序日常開發問題整理 1 切換渲染模式1.1 WebView 的鏈接在模擬器可以打開&#xff0c;手機上無法打開。 1 切換渲染模式 1.1 WebView 的鏈接在模擬器可以打開&#xff0c;手機上無法打開。 在 app.json 中看到如下配置項&#xff0c;那么當前項目就是 keyline 渲染模式…

【Altium Designer】銅皮編輯

一、動態銅皮與靜態銅皮的區分與切換 動態銅皮&#xff08;活銅&#xff09;&#xff1a; 通過快捷鍵 PG 創建&#xff0c;支持自動避讓其他網絡對象&#xff0c;常用于大面積鋪銅&#xff08;如GND或電源網絡&#xff09;。修改動態銅皮后&#xff0c;需通過 Tools → Polygo…