pro git學習筆記 2 分支

2022-04-13 07:40:00 字數 3103 閱讀 2564

幾乎每一種版本控制系統都以某種形式支援分支。使用分支意味著你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。在很多版本控制系統中,這是個昂貴的過程,常常需要建立乙個源**目錄的完整副本,對大型專案來說會花費很長時間。

有人把 git 的分支模型稱為「必殺技特性」,而正是因為它,將 git 從版本控制系統家族裡區分出來。git 有何特別之處呢?git 的分支可謂是難以置信的輕量級,它的新建操作幾乎可以在瞬間完成,並且在不同分支間切換起來也差不多一樣快。和許多其他版本控制系統不同,git 鼓勵在工作流程中頻繁使用分支與合併,哪怕一天之內進行許多次都沒有關係。理解分支的概念並熟練運用後,你才會意識到為什麼 git 是乙個如此強大而獨特的工具,並從此真正改變你的開發方式。

在 git 中提交時,會儲存乙個提交(commit)物件,該物件包含乙個指向暫存內容快照的指標,包含本次提交的作者等相關附屬資訊,包含零個或多個指向該提交物件的父物件指標:首次提交是沒有直接祖先的,普通提交有乙個祖先,由兩個或多個分支合併產生的提交則有多個祖先。

1. 開發某個**。 2. 為實現某個新的需求,建立乙個分支。 3. 在這個分支上開展工作。

現在,你決定要修補問題追蹤系統上的 #53 問題。順帶說明下,git 並不同任何特定的問題追蹤系統打交道。這裡為了說明要解決的問題,才把新建的分支取名為 iss53。要新建並切換到該分支,執行git checkout並加上-b引數:

$ git checkout -b iss53 switched to a new branch "iss53"
這相當於執行下面這兩條命令:

$ git branch iss53 $ git checkout iss53
留心你的暫存區或者工作目錄裡,那些還沒有提交的修改,它會和你即將檢出的分支產生衝突從而阻止 git 為你切換分支。

切換分支的時候最好保持乙個清潔的工作區域。稍後會介紹幾個繞過這種問題的辦法(分別叫做 stashing 和 commit amending)。目前已經提交了所有的修改,所以接下來可以正常轉換到master分支:

git 會把工作目錄的內容恢復為檢出某分支時它所指向的那個提交物件的快照。它會自動新增、刪除和修改檔案以確保目錄的內容和你當時提交時完全一樣。

接下來,你得進行緊急修補。我們建立乙個緊急修補分支hotfix來開展工作,直到搞定

有必要作些測試,確保修補是成功的,然後回到master分支並把它合併進來,然後發布到生產伺服器。用git merge命令來進行合併:

請注意,合併時出現了「fast forward」的提示。由於當前master分支所在的提交物件是要併入的hotfix分支的直接上游,git 只需把master分支指標直接右移。換句話說,如果順著乙個分支走下去可以到達另乙個分支的話,那麼 git 在合併兩者時,只會簡單地把指標右移,因為這種單線的歷史分支不存在任何需要解決的分歧,所以這種合併過程可以稱為快進(fast forward)。

現在最新的修改已經在當前master分支所指向的提交物件中了,可以部署到生產伺服器上去了(見圖 3-14)。

在那個超級重要的修補發布以後,你想要回到被打擾之前的工作。由於當前hotfix分支和master都指向相同的提交物件,所以hotfix已經完成了歷史使命,可以刪掉了。使用git branch-d選項執行刪除操作:

命令不僅僅能建立和刪除分支,如果不加任何引數,它會給出當前所有分支的清單:

注意看master分支前的*字元:它表示當前所在的分支。也就是說,如果現在提交更新,master分支將隨著開發進度前移。若要檢視各個分支最後乙個提交物件的資訊,執行git branch -v

git branch --merge檢視哪些分支已被併入當前分支(譯註:也就是說哪些分支是當前分支的直接上游。)

之前我們已經合併了iss53,所以在這裡會看到它。一般來說,列表中沒有*的分支通常都可以用git branch -d來刪掉。原因很簡單,既然已經把它們所包含的工作整合到了其他分支,刪掉也不會損失什麼。

另外可以用git branch --no-merged檢視尚未合併的工作:

它會顯示還未合併進來的分支。由於這些分支中還包含著尚未合併進來的工作成果,所以簡單地用git branch -d刪除該分支會提示錯誤,因為那樣做會丟失資料:

$ git branch -d testing error: the branch 'testing' is not an ancestor of your current head. if you are sure you want to delete it, run 'git branch -d testing'.
不過,如果你確實想要刪除該分支上的改動,可以用大寫的刪除選項-d強制執行,就像上面提示資訊中給出的那樣。

由於 git 使用簡單的三方合併,所以就算在較長一段時間內,反覆多次把某個分支合併到另一分支,也不是什麼難事。也就是說,你可以同時擁有多個開放的分支,每個分支用於完成特定的任務,隨著開發的推進,你可以隨時把某個特性分支的成果並到其他分支中。

現在我們來看乙個實際的例子。請看圖 3-20,由下往上,起先我們在master工作到 c1,然後開始乙個新分支iss91嘗試修復 91 號缺陷,提交到 c6 的時候,又冒出乙個解決該問題的新辦法,於是從之前 c4 的地方又分出乙個分支 

iss91v2,乾到 c8 的時候,又回到主幹master中提交了 c9 和 c10,再回到iss91v2繼續工作,提交 c11,接著,又冒出個不太確定的想法,從master的最新提交 c10 處開了個新的分支dumbidea做些試驗。 

Git筆記 2 分支管理

svn有分支管理,但是建立和切換分支耗時特別長,形同虛設。建立於合併分支 檢視分支 git branch 建立分支 git branch 切換分支 git checkout 建立 切換分支 git checkout b 合併某分支到當前分支 git merge 刪除分支 git branch d 強...

python學習(2) 分支語句

python學習 1 變數 1.的展示 num input 輸入數字 print s num 10 print format num 10 2.分支語句 if elif else num int input 數字 if num 10 print 數字大於10 elif num 5 print 數字大...

git gitub學習筆記5(分支)

在版本控制過程中,使用多條線同時推進多個任務。本地庫建立以後,就會有master主幹分支。開闢乙個分支一般以feature開頭 工作 一 同時並行推行多個功能的開發,提高開發效率 二 各個分支在開發的過程中,如果乙個分支開發失敗,不會影響其他分支,失敗的分支重新開發即可 svn對分支開發的效率較低 ...