什麼是分支
分支就像是主要道路分出來的其他小路。
像是孫悟空想要他的一個分身去執行某件事情,於是拔了一根毛就化成他的樣子去執行任務。
任務執行完了就不見了,或者化身回去本體裡面。
為什麼要開分支
以 git 的專案來說,目前有個捐贈系統,我想要新增一個功能叫做批次匯入功能。
於是就開了一個分支開始撰寫這個功能,寫完了測試沒問題再把這個功能合併回主分支,這樣在開發過程中就不會影響到原本系統的運作。
實務上常遇到的狀況就是,在開發過程不是一兩天就能寫好,如果把還沒寫好的功能提交上去,這樣使用者去使用就會發生問題,甚至把系統資料弄亂。
但也不能因為還沒寫完就不提交,如果中間都不提交,那麼開發時發生問題想回到上個版本就沒辦法了。
我們在分支裡開發,反正改來改去都是在這個分支裡,改壞了也沒關係,正常提交也不會影響原本的系統。
還有個狀況,就是新功能開發到一半,結果使用者回報原本的系統有個問題需要馬上修改並上線,此時就麻煩了,
這時修完 bug 但新功能又還沒開發好,為了這個 bug 就把專案推上去又會發生之前敘述的未完成功能產生的操作風險,
但不推上去就不能立刻讓使用者使用已經修好 bug 的系統,等你新功能開發好再一起推上去都不知是何時了。
這時候分支就很好用了,開個 A 分支修 bug 再開個 B 分支寫新功能,這樣大家都不衝突,看哪個版本想合併回去主幹道就選擇哪個版本。
如果有多人開發不同功能又全都在主幹道的話,系統肯定會被弄得不穩定,這樣也無法發揮多人開發的優勢。
列出分支
使用 branch 可以列出分支:
$ git branch
* master
這表示現在只有一個 master 也就是主分支,前面有個星號表示目前我們位在這個分支中,
從 git bash 的提示符號也可以看到目前所在分支的名稱。
建立分支
我們建立也就是新增一個分支,名為 dog 好了:
# 建立 dog 分支
$ git branch dog
# 再次查看目前的分支狀況
$ git branch
dog
* master
看到 dog 分支出現了,但我們沒有切換到 dog 分支,所以還在 master 主分支(主幹道) 中。
分支更名
可以隨時修改分支的名稱,不會影響到任何檔案內容:
# 把 dog 分支改成 cat
$ git branch -m dog cat
# 再次查看目前的分支狀況
$ git branch
cat
* master
分支的確成功被我們更名了。
想要更改主分支的名稱也可以,方法同上。
切換分支
使用 checkout 可以切換分支:
# 切換到 cat 分支
$ git checkout cat
Switched to branch 'cat'
# 再次查看目前的分支狀況
$ git branch
* cat
master
切換成功了,如果在該分支下作業,不管是 add 或 commit 都是只有針對該分支而已,不會影響到其他分支。
這樣我們就不怕把系統改亂了,大不了就不要這個分支就好了。
另外,切換到不存在的分支當然會報錯:
# 切換到 dog 分支
$ git checkout dog
error: pathspec 'dog' did not match any file(s) known to git
我們沒有 dog 分支,他已經被我們改成 cat 了。
如果在 checkout 後面加上 -b
參數,這樣不存在的分支就會被自動建立,不管存不存在都會切換過去。
刪除分支
先切回 master 主分支,再使用 -d
參數把 cat 分支刪掉,假設該分支還沒有被合併到主分支就無法刪除:
# 切換回 master 主分支
$ git checkout master
Switched to branch 'master'
# 刪除 cat 分支
$ git branch -d cat
error: The branch 'cat' is not fully merged.
If you are sure you want to delete it, run 'git branch -D cat'.
這算是一種保護措施,避免資料遺失。
從提示訊息也可看出,硬要刪掉的話就把小寫 d 改成大寫 d 就可以刪掉了
主分支也可以刪,但現在所處的分支刪不了,切換到其他分支就可以刪了。
# 強制刪除 cat 分支
$ git branch -D cat
Deleted branch cat (was e8eeffd).
$ git branch
* master
刪除成功,我們又回到這章還沒開始的原點囉。