學習目標:了解 Branch、Merge是什麼,如何使用
為什麼要用分支(Branch)
在 [第一週]版本控制與 Git 基本指令,可以發現是屬於一條線的開發模式。
假設我們正在開發新的功能的途中,有個緊急的修正怎麼辦?這就會非常麻煩。
因此如果可以分成「開發新功能」、「穩定版本」…,各種不同分支的話,就可以待開發完成或修正好再 commit 到穩定的版本,就不會影響到開發中的檔案、也不會造成衝突,這就是分支的功能。
開始 Branch 之旅
打開終端機(Terminal)到有進行版控的資料夾後,可以發現有寫 master ,這是 Git 幫你建立的第一個分支。
[補充說明] master 是什麼?其實不用想的太複雜,他就只是個名字,要是我想幫他改名也是沒有問題,只不過實務上不會有人這樣做,然後再說明一下,在實務上 master 這條分支上通常是穩定的版本,因此基本上不會直接對 master 做修改,假設有緊急修改的狀況,通常會用 hotfix 這個方式來解決
新增分支 branch
- 如果 git branch 後面沒有接參數,就會顯示目前這個專案有哪些分支
- 變化型
- 新增分支:
$ git branch <branchName>
2. 查看目前在哪個個分支: $ git branch -v
3. 分支改名:$ git branch -v <branchName> <new-branchName>
#想換隨時可以換,不影響檔案或目錄
4. 刪除分支:$ git branch -d <branchName>
如果要刪除的分支還有未合併的內容,git 會貼心提醒:
如果真的硬要刪除,只要改用 -D
參數就可以強制刪除
切換分支 Checkout
- 在 [第一週]版本控制與 Git 基本指令 切換版本已經出現過,這邊就是將 版本號 換成 分支名稱
- 寫法
$ git checkout <branchName>
- 變化型
1. 新增分支並切換:$ branch checkout -b newBranch
2. 刪除分支:$ branch checkout -v <branchName>
合併分支 Merge
當我們在分支差不多處理好問題或任務後,就可以利用 merge 這個指令將兩個分支進行合併
一場成功的合併,需要注意以下幾點(轉 30 天精通 Git 版本控管):
- 合併之前,先看清楚自己在哪個分支
- 合併之前,請確保工作目錄是乾淨的
- 合併時請用 git merge [另一個分支] 來將另一個分支的變更合併回來
- 合併成功後,你可以利用 git log 查看版本紀錄,你可以發現「合併」的過程會自動建立一個新版本!
首先我們有兩個分支 master 及 one,one 有多一個檔案叫 add.txt
將 one 合併到 master
step1. 切換到 master 這個分支
$ git checkout master
step2. 合併 one
$ git merge one
就完成基本的合併了
Q:A 合併 B,跟 B 合併 A 有什麼不同?
A:以結果來說並沒有不同,但 Git 處理的過程不同,A跟B都來自 master 分支,所以假設 master 不管要合併 A 或 B ,Git 都會直接使用 快轉模式 (Fast Forward),直接收割 A 或 B的成果。
但若反過來 A 或 B 要合併 master Git ,因為起點的不同(AB的起點是 master 某個 commit;而 master 的起點是 init git !)Git 會額外的產生 commit 來指向特定的 tree 物件以及 blob 物件
#參考 為你自己學Git
Q:合併後的分支要刪除嗎?
A:看了很多文章大部分都在合併的最後一個步驟就是刪除不必要的分支,但其實要不要刪除都可以,分支本身像貼紙一樣,刪除分支的動作就像把一張貼紙撕起來而已。原本貼紙貼的內容並不會消失。所以都可以。
Q:合併發生衝突
之前公司使用 sourcetree 每次發生衝突時都會 hen 緊張,想說是不是搞壞了,介面充斥著看不懂的看不懂的英文及亂碼(那時不知道版本號…,而且都是 Push 後發生衝突… #以前都亂搞R)每次都只能很不好意思地請後端幫忙處理。
其實衝突就是「同一份檔案的兩個版本,裡面有一個或多個不同的內容」
但是 Git 不知道你要留下什麼檔案,所以就跟你說:「內容需要手動調整」
處理衝突開始
- 分支:master、one
- 衝突檔案:welcome.html
one 合併到 master
衝突發生
接著就把衝突的檔案開啟,進行修正,將想要保留的內容留下,並把 Git 的提示文字刪除
修改過後的結果
接著把這個檔案加入暫存區
$ git add welcome.html
然後在 commit 就大功告成了
$ git commit -m ‘修改衝突完成‘
[補充說明] 如果想練習 Branch 等 Git 的其他進階指令很推薦 Learn Git Branching他的優點是圖像化學習 Git 並用闖關的方式一步步了解,自己學起來覺得很不錯。
重點整理
分支(branch)以個人開發來看,是為了解決開發新功能途中遇上緊急修正的情況,我們透過分支可以將「開發新功能」、「修正」分開成兩條線,在開發新功能的同時,可以修正穩定版本的 bug。
- 開啟新的分支:
$ git branch <branchName>
- 確認目前所在分支:
$ git branch -v
- 切換分支:
$ git checkout <branchName>
- 刪除分支:
$ git branch -r <branchName>
- 合併分支:
$ git merge <被合併分支 branchName>
- 假設在合併時發生衝突,必須開啟檔案手動解決衝突,重新
$ git add
並$ git commit
,git 會新增一個版本。