---
# System prepended metadata

title: 六角學院 Git 團隊訓練任務練習（五）
tags: [Git]

---

# 六角學院 Git 團隊訓練任務
## 任務五：GitHub PR 衝突解決
來源：
- [Git 團隊訓練任務](https://hackmd.io/8uEPk1GeTBCl8lUQfD5b5Q)
- [Git 任務五](https://hackmd.io/wzHNLy6aSqG59GeNoLwXSQ)

---

## 任務流程

- [ ]  1-1：<font color="red">**A 成員**</font> 新增一個新的 Repo，**將 B 成員加入協做**。增加 `index.html`，並在 `index.html` 加入以下內容，在 `main` commit 一個版本，**進行 git push 動作**，**==<font color="blue">B 成員</font> 也將進度 clone 下來==**。

    ::: spoiler {state="open"} HTML 內容
    ```
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
    </body>
    </html>
    ```
    :::
    
- [ ] 1-2：<font color="red">**A 成員**</font> 在 `main` 分支進度上，開一個 `feature/editTitleA` 的分支 ，在`index.html` 的 title 調整為 `修改 Title A`， **將 `feature/editTitleA` 分支進行 git push，並發 PR 合併到 `main`，並指派 B 成員 review**。
    
    ::: spoiler {state="open"} 提示
    1. 在 `main` 分支進度上，開分支 `feature/editTitleA`，並切換至此。
        ```bash
        git checkout -b feature/editTitleA
        ```
    
    2. 將 `index.html` 的 title 調整為 `修改 Title A`，一直進行到 push。
        ```bash
        git add .
        git commit -m "修改 Title A"
        git push origin feature/editTitleA
        ```
    
    3. 發 PR 合併到 `main`，並指派 B 成員 review。
    :::
    
- [ ] 1-3：<font color="blue">**B 成員**</font> 在 `main` 分支進度上，開一個 `feature/editTitleB` 的分支 ，在 `index.html` 的 title 調整為 `修改 Title B`， 將 `feature/editTitleB` 分支進行 git push，並發 PR 合併到 `main`，並指派 A 成員 review。
    
    ::: spoiler {state="open"} 提示
    1. 在 `main` 分支進度上，開分支 `feature/editTitleB`，並切換至此。
        ```bash
        git checkout -b feature/editTitleB
        ```
    
    2. 將 `index.html` 的 title 調整為 `修改 Title B`，一直進行到 push。
        ```bash
        git add .
        git commit -m "修改 Title B"
        git push origin feature/editTitleB
        ```
        
    4. 發 PR 合併到 `main`，並指派 A 成員 review。
    :::
    
- [ ] 1-4：<font color="blue">**B 成員**</font> 審核 A 成員 的 PR 通過。
    
    ::: spoiler {state="open"} 提示
    可以先查看內容是否 OK。
    ```bash
    git fetch origin feature/editTitleA
    git checkout origin/feature/editTitleA
    ```
    
    ::: warning
    **注意！**
    切換到 ==**origin/**== feature/editTitleA，代表的是切換到***本地數據庫的遠端分支引用***，此時 HEAD 會處於**分離狀態**。
    使用 `git branch` 查看分支狀態。
    如圖，星號位於 `(HEAD detached at origin/feature/editTitleA)`。
    它並不隸屬於任何一個分支，只是一個暫時的狀態。
    ![image](https://hackmd.io/_uploads/H1ZEdL3o6.png)
    :::

### 以下有兩個版本
#### 版本一：B 開發者自行處理 (業界傾向此種流程)

- [ ] 1-5：<font color="red">**A 成員**</font> 檢視 B 的 PR 會發生衝突，於是退回 PR 或 ==**留言請 B 成員修好**==。

- [ ]  1-6：<font color="blue">**B 成員**</font> 進行 `git fetch origin main` 指令抓最新版本下來後，git checkout 到 `feature/editTitleB`，並合併 `origin/main` 進度，合併發生衝突需解衝突。並將 title 改為 `修改 title AB`， **將 `feature/editTitleB` 分支進行 git push，並請 A 成員 review**。
    
    ::: spoiler {state="open"} 提示
    1. fetch 最新的 `main` 下來。
        ```bash
        git fetch origin main
        ```
        註：其實直接 `git fetch` 抓所有分支也可以，fetch 只是抓線圖下來看，並不影响程式。
        
    2. 確認有位於分支 `feature/editTitleB`，若沒有則切換過去。
        ```bash
        # 查看本地所在分支
        git branch
        
        # 切換分支
        git checkout feature/editTitleB
        ```
        註：若當初有切換到 `origin/feature/editTitleA` 分支查看，則分支會處於**分離狀態**，此時需要將分支切換回 `feature/editTitleB`。
        
    3. 合併 `origin/main` 進度。
        ```bash
        git merge origin/main
        ```
        
        ::: warning
        **注意！**
        合併 ==**origin/**== main，這代表它合併的是***本地數據庫的遠端分支引用***。
        也就是說，合併的是 ==**遠端**== 版本，而不是 **本地端** 的 main 分支版本。
        
        因為剛才都只有做 fetch 並沒有 pull，因此本地端的 main 並沒有最新的程式，所以這邊使用**合併遠端**的做法。
        :::
        
    4. 解衝突，將 title 改為 `修改 title AB`，一直進行到將 `feature/editTitleB` 分支 push。
        ```bash
        git add index.html
        
        # 會開啟編輯器
        git commit
        
        git push origin feature/editTitleB
        ```
        註：若編輯器為 Vim 則輸入 `:wq` 存檔離開。
    
    5. 在 PR 上留言請 A 成員再次 review。
    :::
    
- [ ] 1-7：<font color="red">**A 成員**</font> 審核成功後，用 GitHub Pages 觀看 `main` 分支的頁面是否有出現預期網頁畫面。
    
    ::: spoiler {state="open"} 提示
    可以先查看內容是否 OK。
    ```bash
    git fetch origin feature/editTitleB
    git checkout origin/feature/editTitleB
    ```
    :::

#### 版本二：幫忙 Review 的 A 開發者，fetch 下來解衝突 (除非你主管跟同事是好人 ||應該是菩薩吧 😂||，才是此版本)

- [ ] 1-5：<font color="red">**A 成員**</font> 檢視 B 的 PR 會發生衝突

- [ ]  1-6：<font color="red">**A 成員**</font> 進行 `git fetch origin main`、`git fetch origin feature/editTitleB` 指令抓最新版本下來後，git checkout 到 `feature/editTitleB`，並合併 `origin/main` 進度，合併發生衝突需解衝突。並將 title 改為 `修改 title AB`， **將 `feature/editTitleB` 分支進行 git push，並審核通過 PR**。
    
    ::: spoiler {state="open"} 提示
    1. fetch 所有分支最新狀態。
        ```bash
        git fetch
        ```
        
    2. 切換到 `feature/editTitleB` 分支，並合併 `origin/main` 進度。
        ```bash
        git checkout feature/editTitleB
        git merge origin/main
        ```
        
    3. 解衝突，將 title 改為 `修改 title AB`，一直進行到將 `feature/editTitleB` 分支 push。
    :::
    
- [ ] 1-7：<font color="red">**A 成員**</font> 審核成功後，用 GitHub Pages 觀看 `main` 分支的頁面是否有出現預期網頁畫面。
<br>

## 通關檢核點

- [ ]  A、B 成員與 GitHub Repo 都有相同的 commit 數量
- [ ] 預期線圖有符合
<br>

## 預期線圖
![](https://hackmd.io/_uploads/Sk-JO9yGp.png)

---

## 補充知識
- ***`git checkout -b <分支名稱>`*** 結合了以下兩個指令：
    ```
    git branch <分支名稱>
    git checkout <分支名稱>
    ```
- [10.3 Git 内部原理 - Git 引用](https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-%E5%BC%95%E7%94%A8)

