# 前言 在認識完常見 Work Flow 的定義後,我們可以延伸討論一個 Git 指令 - `git fork` 前面文章所討論的 Work Flow,皆是在<u>工程師們已擁有 Repository 編輯權限</u>的前提下,才能正常運行。 那麼在工程師們沒有編輯權限的情況下,我們可以如何做到修改程式碼? </br> # Git Fork 在一些社群共同維護的大型 Open Source 項目,或是第三方團隊所提供的元件項目中,我們通常不會擁有該 Repository 的編輯權限。 此時,如果該項目存在 Bug,便無法對來源端的原始碼協助進行修復,以徹底解決問題。 Frok 叉子,我們可以使用 `git fork` 指令,將原始專案的 Repository 叉回自己的 GitHub,再著手進行後續的 Bug 修復。 </br> # 情境 假設A使用者擁有一個 Open Source Repositroy,其內容是由上萬位工程師們共同維護的 Open Source 項目 ![git fork - 1](https://hackmd.io/_uploads/ByBe8TJekl.jpg) </br> 而 Lion 也想為該 Open Source 項目盡一份心力,在查看 Open Source Repository 的程式碼時,發現某段程式碼可以有更好的寫法。 但 Lion 因為存取權限的關係,無法直接對A使用者的 Open Source Repository 進行編輯或是程式碼的提交。 ![git fork - 2 (1)](https://hackmd.io/_uploads/ByRp7Ize1l.jpg) </br> 這時候 Lion 可以改用 `git fork` 的方式,將A使用者的 Open Source Repository,Fork 回 Lion 的 Repository 對於 Lion 自己的 Lion Repository,Lion 就會擁有完整的存取權限,可以隨意進行編輯、提交或創建分支等所有操作。 ![git fork - 3 (1)](https://hackmd.io/_uploads/rkLkELfgJe.jpg) </br> 在完成程式碼的修改後,Lion 可以先將優化後的程式碼推送至 Lion Repository ![git fork - 4](https://hackmd.io/_uploads/H1FrqTJl1x.jpg) </br> 再從 Lion Repository 向原始專案A使用者的 Open Source Repository 建立 Pull Request(PR)。 當 Lion 的 Pull Request 送出後,A使用者就會收到 Mail 通知。 可以看到 Lion 向 Open Source Repository 所提交的 Pull Request,其中包括異動的程式碼、異動說明等 ![git fork - 5 (1)](https://hackmd.io/_uploads/rkzN7IMlJg.jpg) </br> A使用者可以針對這個 Pull Request 給予反饋或是提出討論 在 Pull Request 的討論過程中,Lion 仍可以持續向 Lion Repository 進行推送,以跟上 Pull Request 的討論內容 ![git fork - 6](https://hackmd.io/_uploads/SJSHlR1lye.jpg) </br> 當確認完 Pull Request 的異動內容後,A使用者可以選擇同意或關閉該 Pull Request。 ![git fork - 7](https://hackmd.io/_uploads/rko9VCyekx.jpg) </br> 同意 Pull Request 後,由 Lion 所異動的程式碼,就會合併至A使用者的 Open Source Repository。 ![git fork - 8 (1)](https://hackmd.io/_uploads/r1L9HEWlyx.jpg) </br> 至此,Lion 就成功為該 Open Source 項目做出了優化的貢獻 </br> # 完整流程圖 ![git fork - 8](https://hackmd.io/_uploads/SyO-LAJeJx.jpg) 1. `git fork` to Lion Repository 2. `git push` modified code 3. Create Pull Request 4. Feedback/Discussion Pull Request 5. Agree/Close Pull Request 6. Merge into original Repository </br> # 總結 執行 `git fork` 指令後,後續流程便與原先介紹的 Work Flow 相同,可以隨意在自己的 Repository 建立/合併分支、提交/推送程式碼等操作。 惟最後多出需要向來源 Repository 建立合併 Pull Request 的步驟。 </br> # 參考資料 https://git-scm.com/book/zh-tw/v2/GitHub-%e5%8f%83%e8%88%87%e4%b8%80%e5%80%8b%e5%b0%88%e6%a1%88 [Will 保哥 - 30 天精通 Git 版本控管 (28):了解 GitHub 的 fork 與 pull request 版控流程](https://ithelp.ithome.com.tw/m/articles/10140305) </br> >[!Tip] 文章內容皆為個人整理的觀點,以及整理後的個人想法,如內容有錯誤或疑慮的部分,歡迎提出討論,收到後會盡快修正!