Github 的一大特色就是 Pull Request 功能(簡寫為 PR)。
一、Pull Request 是什么?
Github 官方文檔的定義如下。
"Pull Request 是一種通知機(jī)制。你修改了他人的代碼,將你的修改通知原來的作者,希望他合并你的修改,這就是 Pull Request。"
Pull Request 本質(zhì)上是一種軟件的合作方式,是將涉及不同功能的代碼,納入主干的一種流程。這個過程中,還可以進(jìn)行討論、審核和修改代碼。
二、Pull Request 的流程
第一步,你需要把別人的代碼,克隆到你自己的倉庫,Github 的術(shù)語叫做 fork。
第二步,在你倉庫的修改后的分支上,按下"New pull request"按鈕。
bg2017071802.png
這時,會進(jìn)入一個新頁面,有Base 和 Head 兩個選項。Base 是你希望提交變更的目標(biāo),Head 是目前包含你的變更的那個分支或倉庫。
bg2017071806.png
第三步,填寫說明,幫助別人理解你的提交,然后按下"create pull request"按鈕即可。
bg2017071805.png
PR 創(chuàng)建后,管理者就要決定是否接受該 PR。對于非代碼變更(比如文檔),單單使用 Web 界面就足夠了。但是,對于代碼變更,Web 界面可能不夠用,需要命令行驗證是否可以運行。
三、git am
git am命令用于將一個 patch 文件,合并進(jìn)入當(dāng)前代碼。
Github 對每個 PR 會自動生成一個 patch 文件。我們下載該文件,合并進(jìn)本地代碼,就可以在本地查看效果了。
$ curl -L http://github.com/cbeust/testng/pull/17.patch | git am
上面代碼中,curl的-L參數(shù)表示,如果有302跳轉(zhuǎn),curl會自動跟進(jìn)。后面網(wǎng)址里面的/cbeust/testng是目標(biāo)倉庫,pull/17表示該倉庫收到的第17個 PR。
如果 PR 只包含一個 commit,那么也可以直接下載這個 commit 的 patch 文件。
$curlhttps://github.com/sclasen/jcommander/commit/bd770141029f49bcfa2e0d6e6e6282b531e69179.patch | git am
上面代碼中,網(wǎng)址里面的/sclasen/jcommander是代碼變更所在的那個倉庫。
四、創(chuàng)建遠(yuǎn)程倉庫
另一種方法是為 PR 創(chuàng)建一個遠(yuǎn)程分支,追蹤提交者的倉庫。
//創(chuàng)建遠(yuǎn)程倉庫,指向 PR 提交者的倉庫
$ git remote add nullin git://github.com/nullin/testng.git
//從該遠(yuǎn)程倉庫拉取代碼
$ git fetch nullin
//將該倉庫的某個分支合并到當(dāng)前分支
$ git merge kneath/error-page
//推送到自己的倉庫
$ git push origin master
五、cherry-pick
有時,PR 里面包含好幾個 commit,但是你只想合并其中的一個或幾個。
這時可以使用cherry-pick命令,挑出你感興趣的 commit。
//建立遠(yuǎn)程分支,追蹤提交者的倉庫
$ git remote add nullin git://github.com/nullin/testng.git
//從該遠(yuǎn)程倉庫拉取代碼
$ git fetch nullin
//只將感興趣的 commit 加入當(dāng)前代碼
$ git cherry-pick commit1
$ git cherry-pick commit2
//推送到自己的倉庫
$ git push origin master