---
# System prepended metadata

title: 6.1 為甚麼要使用分支?
tags: [Git]

---

# 6.1 為甚麼要使用分支?
###### tags: `Git`

# 01 為甚麼要使用分支呢?
如果一個人在做某個案子的時候，想commit就commit也沒問題，可是如果今天是一個團隊的人在合作，就沒辦法想commmit就commit，這時候就需要分支。

分支的用途有很多，你可以修正bug,或是想嘗試新功能,又或是要新增新功能的時候都會用到分支。待做完之後確認沒問題再合併回來，就不會影響正在運作的產品線。

有時候多人開發的時候，可以引入像是[git flow](https://gitbook.tw/chapters/gitflow/why-need-git-flow.html)的開發流程，讓同一個團隊的人都可以用相同的方式進行開發減少不必要的溝通。

# 02 分支有哪些指令?

## 02-1 開啟分支
1. 打開已經開始被git追蹤的檔案位置
2. 輸入`git branch firstBranch`
3. 你可以在sourceTree看到旁邊有分支了
![](https://i.imgur.com/0F3Bhwe.png)

## 02-2 刪除分支
1. 有兩種方法
	1. `git branch -d BranchName`: 刪除
	2. `git branch -D BranchName`: 如果-d刪不掉，還可以使用-D來強制刪除

## 02-3 切換分支
1. 你可以使用`git checkout BranchName`來切換分支
2. 切換完之後，呼叫`git branch`來看一下你目前正在哪個分支上，可以看到master旁邊有`*`
![](https://i.imgur.com/LEEbpnc.png)

> 當切換不同的分支的時候裡面的內容也會不一樣
1. 你可以發現第一張圖是firstbranch的分支，裡面有firstBranch.html檔案
![](https://i.imgur.com/CoP3Epz.png)

2. 如果切換到master分支，會發現該分支跟firstBranch分支內容不一樣
![](https://i.imgur.com/OAI7AVY.png)

# 03 如果目前在A分支，還沒commit就換到B分支會發生甚麼事情?
1. 我在firstBranch新增`firstbranch3.html`跟修改`firstbranch1.html`裡面的內容，然後查看一下status
![](https://i.imgur.com/HXHTSAY.png)

2. 你會發現如果想要切換到master就會噴錯
```tiddlywiki
$ git checkout master
error: Your local changes to the following files would be overwritten by checkou
t:
        firstbranch.txt
Please commit your changes or stash them before you switch branches.
Aborting

```
3. 所以他會告訴你先commit再換去別的branch


# 04 合併分支
1. 先切換到master分支
2. 然後使用`git merge 你想要的分支名稱`，你就會發現master沒有的東西現在都有了
![](https://i.imgur.com/KFKMzqc.png)

# 05 合併發生衝突怎麼半?
1. 如果我有三個分支分別為master, firstbranch, secbranch，然後再firstbranch跟secbranch都改了相同的檔案`fristbrach.html`
- firstbranch的html我新增內容為"衝突"
- secbranch的html我新增內容為"衝突2"
兩者都已經commit過，現在我要在firstbranch進行`git merge secbranch`會顯示錯誤說發生衝突，如下。
```tiddlywiki
$ git merge secbranch
Auto-merging firstbranch.txt
CONFLICT (content): Merge conflict in firstbranch.txt
Automatic merge failed; fix conflicts and then commit the result.
```

2. 這時候看一下`git status`，可以發現一段話`both modified:firstbranch.txt` ，或是你去sourceTree看，可以發現檔案被驚嘆號起來了!!
![](https://i.imgur.com/mTuxrmw.png)

3. 打開檔案你會發現，疑? 衝突的內容全部寫進去了
```tiddlywiki
hello world
<<<<<<< HEAD
衝突!!
=======
衝突2
>>>>>>> secbranch
```
## 該如何解決衝突問題呢?
1. 重新修改上面那個同時有兩個內容的檔案，重新add & commit即可

> 但是文字檔還好處理，如果碰到binary files像是圖片名稱重複?
- 這時候可以使用`git checkout --ours 重複的檔案名稱`表示git會採用目前Head所在的branch
- 如果使用`git checkout --theirs 重複的檔案名稱`git就會採用碰撞的另一個branch