[教學] git-18 建立分支 - 討論區

[教學] git-18 建立分支

文章瀏覽次數 863 文章回覆數 2

特種兵

特種兵圖像(預設)

2020-03-19 13:55:48

From:211.23.21.202

什麼是分支

分支就像是主要道路分出來的其他小路。

像是孫悟空想要他的一個分身去執行某件事情,於是拔了一根毛就化成他的樣子去執行任務。

任務執行完了就不見了,或者化身回去本體裡面。

為什麼要開分支

以 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                                                                        

刪除成功,我們又回到這章還沒開始的原點囉。

留言

#1

阿慶

阿慶圖像

2020-03-19 22:02:01

From:122.116.71.150

請問 checkout 除了切換分枝外,還可以救回刪除的檔案,兩者如何區分呢?
且這指令似乎還不只這兩種用途。
還有 checkout -- 這種用法
或者說它確切是用來幹什麼的?
之前學到這指令自己就會搞混,為何兩件不同的事能用同個指令,除非兩者有什麼共通性?
要切換可以用原本的 branch 加上參數似乎也不錯啊!結果卻不是XD

#2

特種兵

特種兵圖像(預設)

2020-03-22 19:17:04

From:1.161.139.155

其實差別是給的參數
給檔案就是救回檔案,給分支名稱就是切換分支,給版號就是切到該版號
但是如果怕自己搞混,那就讓指令變成單一用途,例如
切版號用 reset 救檔案用 restore 切分支用 checkout 做分支用 branch 等等