# Git #4 branch 分支 ###### tags: `Git` ## branch 指令 | 指令 | 說明 | | -------- | -------- | | git branch 分支名稱 | 新增分支 | | git branch | 查看分支 | | git checkout 分支名稱 | 切換到某個分支 | | git merge 分支名稱 | 合併分支 | | git log | 觀看 commit 歷史紀錄也可以查看分支是否有合併 | | git merge 分支名稱 --no-ff | 合併時強制取消快轉 | | git log --oneline --graph | 觀看線圖 | | git reset —hard ORIG_HEAD | 還原合併前狀態 | | git branch 新分支名稱 commit編號 | 將特定 commit 貼上分支 | | git branch -d 分支名稱 | 刪除分支 -D 是強制刪除 | | git reset HEAD^ | 還原上個版本 | ## 什麼是分支 分支就像貼紙一樣會貼在 commit ## 為什麼要用分支? ![](https://i.imgur.com/ChTu1Zw.png) * 多人協作時,不可能都在 master * 可以讓 master 都是正式版資料,可以開分支來做測試或開發,藉此不影響正式主機分支 ## 常見分支名稱 * master 預設分支 - 合併時才會產生 commit * develop 開發分支 - 合併時才會產生 commit * feature 開發新功能分支 --- ## git branch dev - 新增分支 我們開設一個分支叫做 dev ![](https://i.imgur.com/Da6r3a7.png) 使用 `git branch dev ` 新增完之後,用 `git branch` 可以看到除了 master 分支之外,還多了一個 dev 分支 --- ## git checkout dev - 切換分支 創建完之後我們透過 `git checkout` 來切換到 dev 分支 ![](https://i.imgur.com/8vIK9vg.png) 切換到 dev 分支後,並在這個分支上新增檔案,並使用 `git add .` + `git commit -m 'dev 5/27'` 來將檔案新增到本地數據庫 上圖為執行以上動作後, source tree 上有一個 dev 分支並有一個 commit 哩 ### 回到 master 分支檢查 我們在 dev 分支的 index.css 新增一個屬性,<font color='red'> 而在 master 分支的 index.css 並沒有寫下這個屬性 </font> ![](https://i.imgur.com/sIvsDmx.png) <font color='red'>當我們切回去 master 分支時,可以發現這個屬性不見了</font> #### 原因! 因為我們 master 分支的 commit 還在上一版,所以當然不會有 dev 分支新增的檔案 ![](https://i.imgur.com/F3GF8LH.png) --- ## git merge dev - 合併分支 從上面的步驟結果得知, master 分支並沒有 dev 分支相同的檔案進度,但是想要將 master 檔案更新到 dev 分支一樣的話,就要開始使用合併指令 ### step1 切回去 master 因為是 master 進度要跟 dev 一樣,所以我們必須使用 `git checkout master` 回到 master 分支 ### step2 master 合併 dev 切回去 master 分支後就要開始合併分支,使用 `git merge dev` ![](https://i.imgur.com/LVEyghK.png) 執行完之後你就可以看到你的 master 分支的 index.css 也多了跟 dev 分支一樣的屬性哩 ![](https://i.imgur.com/FU5ET7u.png) source tree 可以看到他們兩個分支合再一起了 ![](https://i.imgur.com/ta03oZh.png) **`git log `** 也可以知道合併再一起了沒 --- ## 快轉機制 當我們合併的時候會出現一行 `Fast Forward`,代表觸發了快轉機制 ![](https://i.imgur.com/nggiiMc.png) ### 什麼是快轉機制 透過上一步合併指令,我們將 master 分支的檔案進度變得跟 dev 分支一樣,而快轉機制是 <font color='red'>不會產生額外的 commit ,而是直接到合併分支所屬的 commit 點上 </font> ![](https://i.imgur.com/AWF9y6x.png) 原本 master 是在第二個 commit ,進度跟 dev 不同,我們合併之後,快轉機制直接將 master 移動到了 dev 所在的 commit 惹,並<font color='red'>不會產生另外的 commit</font> ### 非快轉機制 如果我們在 master 分支新增一個 index2.html 檔案並 commit 到本地數據庫,另外在 dev 分支上在新增一個 all3.css 檔案並 commit 到本地數據庫 ![](https://i.imgur.com/gsCAQNC.png) 可以看到 source tree 上 master 跟 dev 出現了分歧點 ### 我們在一次合併 master 跟 dev <font color='red'>記得切換到 master 分支</font>,執行 `git merge dev` 合併 dev ![](https://i.imgur.com/uxmuxpW.png) 合併完之後查看 source tree,可以看到兩個合併再一起了,<font color='red'>提醒!!!!合併完之後 dev 進度不會跟 master 一樣喔</font> ### 那非快轉到底是什麼 因為 master 跟 dev 分支分別各自新增了不同的檔案,所以開啟了分歧點,然而合併指令執行後,Git 又<font color='red'>新增了一個 commit</font> 來連結 ## 快轉與非快轉差異 簡單來說就是有沒有出現分歧點時,出現分歧點時需要另外<font color='red'>在新增一個 commit 來做連結</font> (非快轉),而如果沒有則直接將 commit 進行同步就可以了(快轉) ## 習慣多利用 --no-ff 來取消快轉 這樣比較能看得出來做了什麼事情,commit 不會只是同一條 ## 注意! 如果我們刪除了某個分支,該分支的 commit 並不會消失 ## 練習 [learngitbranch](https://learngitbranching.js.org/?locale=zh_TW) [模擬題目](https://drive.google.com/drive/folders/1koW25onvGTHtnHuob2UR1x6Jxywo34Om)