# 理解如何在Github使用Pull Request (PR)
tags: `Github` `git clone` `git pull` `Pull Request` `codeshiba`
## 學習重點
1. ``git clone`` 完整複製他人專案到自己電腦
2. 建立與切換 branch
3. 設定 upstream
4. 發送 Pull Request 請求合併
5. ``git pull`` 更新既有專案狀態至最新
6. ``clone``和``pull``差別在哪
7. 總結 Pull Request 的流程
8. 為什麼需要透過 Pull Request 來開發
### 1.``git clone`` 完整複製他人專案到自己電腦
- 找到想要複製的專案頁面,這邊複製的是「mentor-program-2nd」
- 點擊「code」,選擇「SSH」,複製「git@.....」整串指令並貼至終端機內。這樣就能把整個專案內容複製一份到本機,且存在同名的目錄裡。

> [高見龍:這裡指的「內容」不是只有檔案,而是指所有整個專案的歷史紀錄、分支、標籤等內容都會複製一份下來。](https://gitbook.tw/chapters/github/clone-repository.html)
- 下載回來後,可以看到同名的目錄,以及目前處於``main``分支。

### 2. 建立與切換 branch
- 新增名為「judy-mission-19」的分支,在終端機中輸入``git branch judy-mission-19``

- 輸入``git branch``查看,確實已成功建立分支

(按鍵盤``q``離開)
- 輸入``git checkout judy-mission-19``從「main」切換至「judy-mission-19」分支

- 在此分支之下,新增名為「judy」的資料夾,並於其中再新增「mission19」資料夾,在資料夾內新增檔案。

- 輸入指令``git add .``把所有異動加入工作目錄索引之中。
- 輸入指令``git commit -m "add description.md"``在字串中說明異動內容,並把異動提交到本機端儲存庫中。(這裡我說明自己新增了一個名為「description」的md檔)
- 可以輸入指令``git status``檢查目前為止的狀態,查看有沒有什麼異動漏掉提交的。如果已經是最新狀態,就會顯示「working tree clean」

### 3. 設定 upstream
- 輸入指令``git push``把所有修改推上Github專案中
- 這邊git跳出錯誤提示,告知遠端並沒有相對應名稱的分支,git會不知道要推去給誰,指示我們``push``的同時需在遠端伺服器那邊也新增一個同名的分支作為上游(upstream)。

- 複製git給的指令
``git push --set-upstream origin judy-mission-19`` 貼上再執行一次。
> [高見龍:設定 upstream 是什麼意思](https://gitbook.tw/chapters/github/push-to-github.html)
- 顯示成功``push``上去。

### 4. 發送 Pull Request 請求合併
到Github「mentor-program-2nd」專案頁面,點擊「New pull request」,比較「judy-mission-19」這個分支內所做的事情,與原本的「main」分支的差異。請原作者審核是否接受並``merge``。
點擊右上角綠色鍵

選擇要compare的分支名稱

PR頁面

可以在Pull Request列表中看到剛才提交的PR

### 5. ``git pull`` 更新既有專案狀態至最新
團隊裡面的大家各自發了新的PR給專案管理者,經過merge之後,則此時專案內容已經跟我當初``clone``下來的不同,因此需要下``git pull``指令,把遠端最新狀態拉下來,更新至本機端。
之後若要再發新的PR,一樣是要再新創一個branch,切換分支,然後才去進行後續的異動。
### 6. ``clone``和``pull``差別在哪
**git clone** 首次把別人的專案完整內容,下載到自己的本機端,是從無到有的過程。
**git pull** 則是已經下載回來的專案,更新至與遠端線上版狀態相同。也就是說本機端這邊,必須有一個既存專案,才會用``pull``去更新它。
### 7. 總結 Pull Request 的流程
基本上就是
* clone專案下來至本機端
* 建立新branch並切換到新branch
* 進行修改與commit
* push上去Github
* 發PR去比較新branch與main這個原本branch之間的差異,附上敘述告知專案管理者我做了什麼,管理者再審核是否接受這些修改並``merge``到「main」分支之中。
> [高見龍的文章教學還有多一個前置步驟「fork」](https://gitbook.tw/chapters/github/pull-request.html)
> 是先把別人的專案「fork」到自己的Github帳號底下,才從自己帳號去「clone」到本機端。但「mentor-program-2nd」沒有開放「fork」功能,所以我省去「fork」步驟,直接把專案「clone」到我的本機。
### 8. 為什麼需要透過 Pull Request 來開發
使用PR來進行專案的狀態修正與維護,能保障專案不會因為團隊成員中的任何一人,做了某項修改以後就直接覆蓋掉別人的貢獻。所有的異動提交,最終會由專案管理者審核接受與否,避免出錯。就是一種大家提出意見,主席最終裁定與彙整的概念。
而且PR的相關紀錄,團隊成員彼此都看得到,也能在上面進行修改討論,有助於開發互動。