---
# System prepended metadata

title: Git Fork
tags: [Git]

---

# 前言
在認識完常見 Work Flow 的定義後，我們可以延伸討論一個 Git 指令 - `git fork`

前面文章所討論的 Work Flow，皆是在<u>工程師們已擁有 Repository 編輯權限</u>的前提下，才能正常運行。

那麼在工程師們沒有編輯權限的情況下，我們可以如何做到修改程式碼？
</br>

# Git Fork
在一些社群共同維護的大型 Open Source 項目，或是第三方團隊所提供的元件項目中，我們通常不會擁有該 Repository 的編輯權限。

此時，如果該項目存在 Bug，便無法對來源端的原始碼協助進行修復，以徹底解決問題。 

Frok 叉子，我們可以使用 `git fork` 指令，將原始專案的 Repository 叉回自己的 GitHub，再著手進行後續的 Bug 修復。
</br>

# 情境
假設Ａ使用者擁有一個 Open Source Repositroy，其內容是由上萬位工程師們共同維護的 Open Source 項目
![git fork - 1](https://hackmd.io/_uploads/ByBe8TJekl.jpg)
</br>

而 Lion 也想為該 Open Source 項目盡一份心力，在查看 Open Source Repository 的程式碼時，發現某段程式碼可以有更好的寫法。

但 Lion 因為存取權限的關係，無法直接對Ａ使用者的 Open Source Repository 進行編輯或是程式碼的提交。
![git fork - 2 (1)](https://hackmd.io/_uploads/ByRp7Ize1l.jpg)
</br>

這時候 Lion 可以改用 `git fork` 的方式，將Ａ使用者的 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 向原始專案Ａ使用者的 Open Source Repository 建立 Pull Request(PR)。

當 Lion 的 Pull Request 送出後，Ａ使用者就會收到 Mail 通知。

可以看到 Lion 向 Open Source Repository 所提交的 Pull Request，其中包括異動的程式碼、異動說明等
![git fork - 5 (1)](https://hackmd.io/_uploads/rkzN7IMlJg.jpg)
</br>

Ａ使用者可以針對這個 Pull Request 給予反饋或是提出討論

在 Pull Request 的討論過程中，Lion 仍可以持續向 Lion Repository  進行推送，以跟上 Pull Request 的討論內容

![git fork - 6](https://hackmd.io/_uploads/SJSHlR1lye.jpg)
</br>

當確認完 Pull Request 的異動內容後，Ａ使用者可以選擇同意或關閉該 Pull Request。

![git fork - 7](https://hackmd.io/_uploads/rko9VCyekx.jpg)
</br>

同意 Pull Request 後，由 Lion 所異動的程式碼，就會合併至Ａ使用者的 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] 
文章內容皆為個人整理的觀點，以及整理後的個人想法，如內容有錯誤或疑慮的部分，歡迎提出討論，收到後會盡快修正！