---
# System prepended metadata

title: 'Git #4 branch 分支'
tags: [Git]

---

# 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)