# 初步掌握Git與Github應用(8) -- Git 分支 (2) ###### tags: `初步掌握Git與Github應用` > 希望藉由這份筆記,讓正在學習這類知識的你/妳,能夠得到些許幫助。:smile: :::info :bulb: **Hint:** 以下筆記內容所使用的作業系統為"Windows 10" ::: 接續前面的內容,接下來將說明如何進行分支(**branch**)的合併(**merge**)。:blush: ## :memo: 分支合併(merge) -- Fast Forward ### :question: 什麼是 Fast Forward ? > Git 的合併(merge) 原則上預設是 Fast Forward。 如下圖 **bugfix** 分支是在 **master** 分支上新建的分支。  合併 **bugfix** 分支到 **master** 分支時, 如果**master** 分支的狀態是沒有更改過的話(開新分支後,沒有在 **master** 分支額外提交紀錄 -- **commit**),那麼這個合併是非常簡單的。 **bugfix** 分支的歷史記錄包含了 **master** 分支的歷史記錄,所以只要把 **bugfix** 移動到 **master** 分支就可以導入 **bugfix** 分支的內容(簡單來說,就是將 **master** 當作標籤撕下來貼到 **bugfix** 目前所在之處)。這樣的合併被稱為 **Fast-Forward (快轉合併)**。  ### :dart: 情境說明 新分支: **feature/add-page** 1. 使用預設的 **merge** 採用 **fast-forward** 進行:<br> 會將 branch 的 commit 紀錄合併到 master 上<br> 指令:`git merge 分支名稱`  2. 不使用 **fast-forward** ,以 **no fast-forward** 進行:<br> 會保留原始 **branch** 上的 **commit** 紀錄,並在 **master** 上增加一個 **merge branch '分支名稱' into master**<br> 指令:`git merge 分支名稱 --no-ff` **–no-ff** 不要快速合併  **no fast-forward** 的好處: 可以完整保留每一個分支的 **commit** 紀錄 **no fast-forward** 的壞處: 若是 **commit** 紀錄只有一個,合併多次就會出現很多小叉路 -- 資料來源: [連猴子都能懂的Git入門指南](https://backlog.com/git-tutorial/tw/stepup/stepup1_4.html)、[連葉子都秒懂的 Fast Forward](https://tzuhui.github.io/2019/06/20/Git/fast-forward/) --- ## :triangular_flag_on_post: 實作 Git Merge -- Fast Forward ### :notebook: 使用的指令 | 指令 | 功能說明 | | ----------------- |:----------------------- | | `git merge 分支名稱` | 將目前所在分支和特定分支合併| * 開新資料夾、切換路徑、安裝本地數據庫、新增檔案  * 加入索引、提交紀錄  * 修改檔案 (**index.html**)  * 查詢狀態 (**modified**)、加入索引、提交紀錄  * 新增分支 (**feature1**)、查詢分支  * 切換到分支 feature1  * 開新資料夾 (**css**)、切換路徑、新增檔案 (**all.css**)、返回上一層  * 目前資料夾內情況  * 修改檔案 (**index.html**)  * 查詢狀態、加入索引、提交紀錄  * 回到 **master** 分支的最新紀錄  * 目前資料夾內情況 (css資料夾不見了)  * 將 **feature1** 和 **master** 進行分支合併  * 目前資料夾內情況 (css資料夾回來了)  :::info :bulb: **Hint:** 建立新分支後,若回到 master 額外提交紀錄 (**commit**),合併分支時有可能會出現**版本衝突**的提示訊息。 ::: --- ## :flags: 實作 Git Merge -- 自動合併 以下說明當 **master** 更新的版本超過新建立的分支時(建立分支後,又回頭去更新 **master** 分支),如何進行同時更新。(**情境: 無衝突版本**)  -- 圖片來源: [連猴子都能懂的Git入門指南](https://backlog.com/git-tutorial/tw/stepup/stepup2_7.html) * 建立資料夾、移動路徑、安裝本地數據庫  * 新增檔案 (**index.html**)  * 編輯檔案 (**index.html**)  * 查詢狀態、加入索引、提交紀錄  * 建立分支 (**feature1**)、切換分支  * 編輯檔案 (**index.html**)  * 查詢狀態、加入索引、提交紀錄  * 切換分支,回到 **master** 分支  * 編輯檔案 (**index.html**)  * 查詢狀態、加入索引、提交紀錄  * 將 **feature1** 和 **master** 進行分支合併  * 出現提示訊息,因為建立分支(**feature1**)後,又去 **master** 分支上提交新版本紀錄 (**commit**),進入 **vim** 編輯器,輸入 `:q`退出。  * 合併分支後,兩版本進行整合 (無衝突出現)。  --- ## :golf: 實作 Git Merge -- 解決衝突 假設團隊其中一部分在新分支上作更新,另一部分則繼續在 **master** 分支上作更新,這樣就很有可能會發生程式碼剛好寫在同一支檔案的某一行,在合併 **(merge)** 時就會發生衝突。  -- 圖片來源: [連猴子都能懂的Git入門指南](https://backlog.com/git-tutorial/tw/stepup/stepup2_7.html) 以下說明如何解決衝突: * 新增資料夾、切換路徑、安裝本地數據庫  * 新增檔案 (**index.html**)  * 編輯檔案 (**index.html**)  * 加入索引、提交紀錄  * 建立分支 (**feature1**)、查詢分支、移動分支  * 編輯檔案 (**index.html**)  * 查詢狀態、加入索引、提交紀錄  * 切換分支,回到 **master** 分支  * 編輯檔案 (**index.html**),修改與 **feature1** 分支同一行的程式碼,刻意製造衝突。  * 加入索引、提交紀錄  * 將 **feature1** 和 **master** 進行分支合併,提示出現衝突(**CONFLICT**),無法正常合併分支。  * 進入檔案 (**index.html**) 查看  * 手動解決衝突,保留2個 **h1** 標籤內容  * 因為有衝突無法進行自動合併,手動加入索引、提交紀錄,成功合併2分支  --- [ToC] ###### Last updated 2021/07/20 by Qi Xiang
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up