# 理解如何在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://i.imgur.com/YhAdxRc.jpg) > [高見龍:這裡指的「內容」不是只有檔案,而是指所有整個專案的歷史紀錄、分支、標籤等內容都會複製一份下來。](https://gitbook.tw/chapters/github/clone-repository.html) - 下載回來後,可以看到同名的目錄,以及目前處於``main``分支。 ![](https://i.imgur.com/xod8ieJ.jpg) ### 2. 建立與切換 branch - 新增名為「judy-mission-19」的分支,在終端機中輸入``git branch judy-mission-19`` ![](https://i.imgur.com/z0rlgxb.jpg) - 輸入``git branch``查看,確實已成功建立分支 ![](https://i.imgur.com/rHNjpLj.jpg) (按鍵盤``q``離開) - 輸入``git checkout judy-mission-19``從「main」切換至「judy-mission-19」分支 ![](https://i.imgur.com/kVlEnUd.jpg) - 在此分支之下,新增名為「judy」的資料夾,並於其中再新增「mission19」資料夾,在資料夾內新增檔案。 ![](https://i.imgur.com/v2kjTzf.jpg) - 輸入指令``git add .``把所有異動加入工作目錄索引之中。 - 輸入指令``git commit -m "add description.md"``在字串中說明異動內容,並把異動提交到本機端儲存庫中。(這裡我說明自己新增了一個名為「description」的md檔) - 可以輸入指令``git status``檢查目前為止的狀態,查看有沒有什麼異動漏掉提交的。如果已經是最新狀態,就會顯示「working tree clean」 ![](https://i.imgur.com/ScNIpPX.jpg) ### 3. 設定 upstream - 輸入指令``git push``把所有修改推上Github專案中 - 這邊git跳出錯誤提示,告知遠端並沒有相對應名稱的分支,git會不知道要推去給誰,指示我們``push``的同時需在遠端伺服器那邊也新增一個同名的分支作為上游(upstream)。 ![](https://i.imgur.com/ToqqrFy.jpg) - 複製git給的指令 ``git push --set-upstream origin judy-mission-19`` 貼上再執行一次。 > [高見龍:設定 upstream 是什麼意思](https://gitbook.tw/chapters/github/push-to-github.html) - 顯示成功``push``上去。 ![](https://i.imgur.com/lluUdru.jpg) ### 4. 發送 Pull Request 請求合併 到Github「mentor-program-2nd」專案頁面,點擊「New pull request」,比較「judy-mission-19」這個分支內所做的事情,與原本的「main」分支的差異。請原作者審核是否接受並``merge``。 點擊右上角綠色鍵 ![](https://i.imgur.com/gLmxtQt.jpg) 選擇要compare的分支名稱 ![](https://i.imgur.com/BEhoO72.jpg) PR頁面 ![](https://i.imgur.com/0M4i96b.jpg) 可以在Pull Request列表中看到剛才提交的PR ![](https://i.imgur.com/mjhQoe1.jpg) ### 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的相關紀錄,團隊成員彼此都看得到,也能在上面進行修改討論,有助於開發互動。