原文連接:如何使用 GitHub Flow 給開源項目貢獻代碼html
GitHub 是什麼?git
GitHub 是經過 Git 進行版本控制的軟件源代碼託管服務。
截止到 2015年,GitHub 已經有超過 2800 萬註冊用戶和 7900 萬代碼庫。事實上已經成爲了世界上最大的代碼存放網站和開源社區。
因此,若是你想要給開源項目貢獻代碼或者翻譯文檔,學會如何使用 GitHub 來正確地貢獻代碼是必不可少的。github
https://github.com/golang/go
記錄在某處。yourname
。打開示例倉庫的 URL,在右上角點擊 Fork
按鈕後,開始等待完成。golang
等待的時間視倉庫的大小而定。shell
在 fork
完成後,你應該能夠在你本身的 GitHub 倉庫看到同名的一個項目。併發
它的 URL 應該爲:https://github.com/yourname/go
。post
發現了嗎?這裏 URL 的變化只不過是將本來的 golang
替換成了 yourname
。fetch
這個 fork
後的項目是你本身能夠隨意修改而不會影響到真正的 go
項目的。下面咱們把它稱之爲副本倉庫。網站
在沒有示例倉庫的 push
權限的狀況下,想要作出的修改可以反映到示例倉庫,也就是原始倉庫,還須要作接下來的一些操做。spa
把你 fork
後的副本倉庫 clone
到本地。
git clone https://github.com/yourname/go go # clone 到本地的 go 目錄
進入倉庫目錄後,可使用以下命令建立並切換到 test
分支。
git checkout -b test # 建立並切換到 test 分支
在這個 test
分支下通過一些修改後,你須要提交這些修改到本地倉庫。
可使用相關命令:
git add -A # 添加全部文件 git commit -m 'Add test' # 提交 commit
先別急着 push
,咱們還有個大問題要解決。
前面已經說過,在副本倉庫作的修改是不會影響到原始倉庫的。一樣,在原始倉庫的更新也不會反映到副本倉庫來。
在 GitHub,若是你副本倉庫的進度落後於原始倉庫還堅持發起 Pull Request
,後果只會是被拒絕。
那麼問題來了,咱們應該如何同步原始倉庫的更新呢?
答案是:區別於 origin
,它是用來向副本倉庫提交更新的遠程倉庫;咱們添加一個 upstream
,也被稱爲 上游
是專門用來同步原始倉庫更新的遠程倉庫。
在默認狀況下,在你 clone
後的倉庫目錄裏,git
已經自動將 origin
和你的副本倉庫關聯在一塊兒了,也就是 https://github.com/yourname/go
。
你能夠經過以下命令查看。
git remote -vv # 兩個 verbose 參數查看遠程倉庫
而後,經過以下命令添加這個 upstream
,使用這個名字只是約定俗成,你能夠用你以爲更好的名字來替換它。
git remote add upstream git@github.com:golang/go.git # 添加 upstream 遠程倉庫
如今,咱們假設在作出修改後,上游(upstream)已經更新了不少提交。
此時若是對上游的變化視而不見,強行 push
併發起 Pull Request
仍是會被拒絕。
能夠經過以下命令拉取併合並上遊的更新:
git checkout master # 切換到默認存在的 master 分支 git pull --rebase upstream master:master # 使用 rebase 模式拉取 upstream/master 上的更新 # 且與本地的 master 合併。第一個 master 是遠程分支,第二個是本地分支。 git checkout test # 切換到前面創建的 test 分支 git rebase master # 使用 rebase 模式合併本地的 test 和 master 分支
也能夠經過另外一種方式:
git checkout master # 切換到 master 分支 git fetch upstream master # 獲取 upstream 上的 master 分支 git checkout test git rebase upstream/master # 使用 rebase 模式合併本地的 test 和 upstream/master 分支
總的來講,能夠把本地的 master
分支看成一個只負責從上游獲取更新的分支,全部本地的改動都不會直接在 master
上面進行。
而是先將上游的 master
和本地的 master
合併,此時,本地的 master
是上游的最新版本;
再經過合併 test
和本地的 master
來完成本地改動的更新。整個過程在未開始合併以前,你的代碼更新應該只會出如今 test
分支上。
注意:在使用 git rebase
相關的命令時,須要謹慎應用在已經提交的更新或遠程倉庫上。
如今,咱們已經完成代碼的修改、上游的同步更新而且完成了合併。
接下來應該將代碼 push
到副本倉庫。
git push origin test # 將本地 test 分支的代碼 push 到 origin 的 test 分支 # 若是該分支不存在則會建立
這個 push
只會更新副本倉庫,並不會影響到原始倉庫。
要將代碼貢獻到原始倉庫,還要發起 Pull Request
。
現代的 GitHub 網站已經爲咱們發起 Pull Request
作了大多數的幕後工做。下面分別說明兩種方法:
push
代碼後,直接登陸到 GitHub 網站,它會智能識別並彈出按鈕 Compare & pull request
,點擊後填寫一些信息便可發起。 New pull Request
。出現以下界面:
再點擊 Create pull request
後填寫一些信息便可。
接下來,原始項目的相關負責人就會審查(review)你的提交,並決定是經過仍是拒絕。
Pull Request
後無人理會,作了許多無謂的工做。發生這種狀況多是負責人已經放棄了這個項目。 至此,咱們已經完成使用 GitHub Flow 向開源項目貢獻代碼的所有步驟。