如何利用 Git 與 GitHub 進行多人協作開發
1. 首先 “Fork” 他人的 repository(程式碼倉庫)
“Fork” 的名詞是 “叉子” 的意思,不過這裡取的是動詞 “分叉,建一個分支” 的意思。進入你想參與合作開發的倉庫介面,點選右上角的 “Fork” 圖示,此時你已經複製了一個副本在你的 GitHub 倉庫中了,或者是說一個新的程式碼倉庫被建立了,可以開啟你的 GitHub 主頁看一看。
注意,這個遠端倉庫是屬於你自己的。這裡 “Fork” 不同於 “Clone”,“Clone” 是發生在你的本地機器中,相當於你複製了一個完全相同的副本在你的終端上,但該副本的遠端倉庫連線的仍然是原作者的倉庫,所以你並不是這個專案倉庫的擁有者,沒有更新它的許可權。
因此,“Fork” 正是我們所需要的。
點選之後可以看到,自己帳號內有一個新的程式碼倉庫被建立了。
然後將這個程式碼倉庫 “Clone”(克隆)到你的本地機器中,可以使用命令列或者 IDE(比如 Intellij IDEA)的 VCS 功能來實現。“Clone” 成功之後你就可以自主修改裡面的內容,然後 “Push” 到遠端倉庫中,注意,這是你自己的遠端倉庫。但是不使用 “Fork”,而是直接 “Clone”(克隆)原作者的倉庫的話,你會得到一個 “fatal: unable to access” 的提示,無法訪問。
在這一環節,所有的修改只發生在你的遠端倉庫中,原作者的程式碼倉庫內容是不會發生任何改變的。這裡最需要理解的是,“Clone” 下來的本地倉庫連線的是你 GitHub 上的遠端倉庫。
2. 開始參與開發前的一些準備
(1)在你做任何開發前,最好先詳細閱讀該專案的 CONTRIBUTING.md 檔案。
(2)瀏覽該專案的 Issues(問題)公告,甚至可以自己建立一個 Issue。
(3)一般不要將自己做的修改提交到 master branch(主分支)上,而是應該提交到某個明確的 topic branch(主題分支,解決某個bug或者新增某一功能的分支)
(4)最好每次只提交較小的修改,並寫好清晰明確的 Commit Messages(提交說明).
(5)如果有需要,請更新 README 檔案。
3. 建立一個 Pull Request
按自己的需要去修改專案內容,然後將所做的修改提交(Add+Commit)到自己的程式碼倉庫,接著到倉庫頁面,點選 New pull request 按鈕。
點選去之後可以看到,左邊紅框是你 “Fork” 的原專案倉庫和分支,右邊紅框是你當前選擇的專案倉庫和分支。其實這裡就是將兩個紅框內的內容作對比,並把不相同的地方顯示出來。因為此時兩個倉庫和分支的內容是完全一樣的,所有沒有什麼資訊顯示出來(我沒有做修改)。不太理解的話,可以自由去嘗試四個下拉框裡不同的選項,很快你就會知道是怎麼回事了。
我這裡任意選擇了原專案的另一個分支,因為這兩個分支不完全相同,所以可以看到出現了一個 “Create pull request” 的按鈕,點選它。
填寫你的請求資訊,說明你做了些什麼之類的。這個請求是發給該專案的維護者(擁有者)的,完成之後點選 “Create pull request” 按鈕即可。
之後專案的維護者會受到你的請求,只要他/她通過了你的請求,你所做的修改就會被整合到原專案的倉庫裡了。
左邊是你的本地倉庫,中間是你在 GitHub 上 Fork 建立的倉庫,右邊是專案的原倉庫。
4. 與原倉庫保持同步更新
說到合作開發就會有一個問題,如何與他人的程式碼保持同步?在自己做開發的過程中,難免會遇到你 “Fork” 的專案已經有了新的更新,這時當然是希望自己倉庫中的程式碼也能同步進行更新。可是,你本地倉庫所連線的遠端倉庫的是你自己的 GitHub 倉庫,而不是原作者的倉庫。解決方法其實很簡單,為你的本地倉庫再新增一個遠端倉庫源。
檢視當前專案所連線的遠端倉庫
開啟終端,進入到專案的 Git 倉庫所在目錄,一般就是專案目錄,輸入:
git remote -v
可以看到目前只連線了我自己的遠端倉庫。
新增原作者的遠端倉庫連線
git remote add upstream https://github.com/GoogleChrome/lighthouse.git
(注意替換原倉庫的 http 連結)
如圖,現在已經成功新增原專案的遠端倉庫了。
還差一點就大功告成了
(1)從原倉庫獲取最新版本到本地
git fetch upstream master
(2)保證當前位於 master 分支上
git checkout master
(3)將最新版本整合到本地 master 分支上
git merge upstream/master
(4)將更新發送到自己的 GitHub 倉庫裡
git push origin master
(1)(2)(3)步可以用
git pull upstream master
這條命令替代,可以這樣不太安全,因為你 fetch(獲取)之後可以通過
gitlog--oneline --graph --decorate --all
來檢視更新的情況,再決定是否 merge(整合)到一起。
作者:Little丶Jerry
連結:https://www.jianshu.com/p/8c69d1021d98
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。