# 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