如何使用 GitHub Flow 給開源項目貢獻代碼

原文連接:如何使用 GitHub Flow 給開源項目貢獻代碼html

GitHub 是什麼?git

GitHub 是經過 Git 進行版本控制的軟件源代碼託管服務。
截止到 2015年,GitHub 已經有超過 2800 萬註冊用戶和 7900 萬代碼庫。事實上已經成爲了世界上最大的代碼存放網站和開源社區。

因此,若是你想要給開源項目貢獻代碼或者翻譯文檔,學會如何使用 GitHub 來正確地貢獻代碼是必不可少的。github

GitHub Logo

準備工做

  1. 關於 git 的基本操做。
  2. GitHub 網站的帳戶。
  3. 將示例倉庫 https://github.com/golang/go 記錄在某處。
  4. 這裏咱們假設你的用戶名爲 yourname

複製(fork)一個倉庫的副本

打開示例倉庫的 URL,在右上角點擊 Fork 按鈕後,開始等待完成。golang

Fork Go 語言源碼倉庫副本

等待的時間視倉庫的大小而定。shell

fork 完成後,你應該能夠在你本身的 GitHub 倉庫看到同名的一個項目。併發

它的 URL 應該爲:https://github.com/yourname/gopost

Fork 以後的樣子

發現了嗎?這裏 URL 的變化只不過是將本來的 golang 替換成了 yournamefetch

這個 fork 後的項目是你本身能夠隨意修改而不會影響到真正的 go 項目的。下面咱們把它稱之爲副本倉庫。網站

在沒有示例倉庫的 push 權限的狀況下,想要作出的修改可以反映到示例倉庫,也就是原始倉庫,還須要作接下來的一些操做。spa

克隆(clone)副本倉庫到本地

把你 fork 後的副本倉庫 clone 到本地。

git clone https://github.com/yourname/go go # clone 到本地的 go 目錄

使用分支(branch)

進入倉庫目錄後,可使用以下命令建立並切換到 test 分支。

git checkout -b test # 建立並切換到 test 分支

在本地倉庫提交(commit)

在這個 test 分支下通過一些修改後,你須要提交這些修改到本地倉庫。

可使用相關命令:

git add -A # 添加全部文件
git commit -m 'Add test' # 提交 commit

先別急着 push,咱們還有個大問題要解決。

跟原始倉庫(upstream)合併

前面已經說過,在副本倉庫作的修改是不會影響到原始倉庫的。一樣,在原始倉庫的更新也不會反映到副本倉庫來。

在 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)到副本倉庫

如今,咱們已經完成代碼的修改、上游的同步更新而且完成了合併。

接下來應該將代碼 push 到副本倉庫。

git push origin test # 將本地 test 分支的代碼 push 到 origin 的 test 分支
# 若是該分支不存在則會建立

這個 push 只會更新副本倉庫,並不會影響到原始倉庫。

要將代碼貢獻到原始倉庫,還要發起 Pull Request

發起合併請求(Pull Request)

現代的 GitHub 網站已經爲咱們發起 Pull Request 作了大多數的幕後工做。下面分別說明兩種方法:

  • push 代碼後,直接登陸到 GitHub 網站,它會智能識別並彈出按鈕 Compare & pull request,點擊後填寫一些信息便可發起。 Compare & pull request 方式
  • 還有一種方式,在副本倉庫的頁面點擊你更新的分支,再點擊 New pull Request

New pull request 方式

出現以下界面:

New pull request 操做界面

再點擊 Create pull request 後填寫一些信息便可。

接下來,原始項目的相關負責人就會審查(review)你的提交,並決定是經過仍是拒絕。

  • 當你的提交有問題時,負責人還會讓你作出一些修改纔給予經過。
  • 當你發現想要對其貢獻代碼的開源項目已經好久沒有更新時,須要謹慎一些。不然會發如今你發起 Pull Request 後無人理會,作了許多無謂的工做。發生這種狀況多是負責人已經放棄了這個項目。 多年未維護的項目

至此,咱們已經完成使用 GitHub Flow 向開源項目貢獻代碼的所有步驟。

參考連接

Git 工做流程

如何在 Github 給開源項目貢獻代碼

相關文章
相關標籤/搜索