「非常有用」如何正確地給開(kāi)源項(xiàng)目提交pr?
如何去參與一個(gè)開(kāi)源庫(kù)的開(kāi)發(fā)
我們經(jīng)常看到一個(gè)開(kāi)源庫(kù)會(huì)有很多人一起去維護(hù),像 vue,webpack 就會(huì)有很多大牛去維護(hù)。
看著這么多大牛去維護(hù)一個(gè)開(kāi)源庫(kù),心里也直撓癢癢,很想自己也能一起去維護(hù)開(kāi)源庫(kù)。
很多人在平時(shí)開(kāi)發(fā)中只是用到簡(jiǎn)單的 git 命令,比如 git clone, git branch, git checkout-b, git add, git commit, git push 這些命令,其實(shí)都只是 git 最基本的操作,有這些基本操作,我們想給開(kāi)源庫(kù)提 pr 還差一點(diǎn)。
下面我把我自己平時(shí)維護(hù) git 庫(kù)的經(jīng)驗(yàn)做一個(gè)總結(jié),也算是給一些想給開(kāi)源庫(kù)提 pr 同學(xué)的一些微小的幫助。
如果有更好的方法,可以評(píng)論補(bǔ)充一下,謝謝大家。
具體流程
想給開(kāi)源庫(kù)提 pr,第一步肯定是我們要有他們庫(kù),并且可以進(jìn)行開(kāi)發(fā)。接下來(lái)我就拿 vue 庫(kù)做一個(gè)示例,看官們可以邊看邊和我一起操作。
1. fork 開(kāi)源庫(kù)
vue 庫(kù)肯定不可能讓我們直接提交,所以我們需要找到 vue 庫(kù),fork 到自己的 github 倉(cāng)庫(kù)中,然后在自己拷貝的 vue 倉(cāng)庫(kù)中操作。
登錄 github,在 github 中搜索 vue。
點(diǎn)擊 fork 按鈕,把開(kāi)源庫(kù) fork 到自己的 github 中。
回到我們自己的 github 中,就可以看到 fork 好的 vue 庫(kù)了。
2. clone 庫(kù)到自己本地
我們將 fork 好的倉(cāng)庫(kù)克隆到自己本地電腦上,然后進(jìn)行開(kāi)發(fā)。
克隆到本地:
# 克隆 vue
git clone https://github.com/Shiyanping/vue.git
# 進(jìn)入本地 vue 文件夾
cd vue
這樣你本地就有了 vue 的克隆版本了,后續(xù)就可以愉快的開(kāi)發(fā)了。
3. 本地創(chuàng)建分支,進(jìn)行開(kāi)發(fā)
摩拳擦掌,開(kāi)始吧,開(kāi)發(fā)之前你要確定好具體開(kāi)發(fā)哪個(gè)分支,因?yàn)槲覀兝聛?lái)的代碼只有默認(rèn)分支,但是有些開(kāi)源庫(kù)是有很多分支的,不同的功能或者不同的版本在不一樣的分支上,這個(gè)在開(kāi)發(fā)之前要確定好。
如果你只是開(kāi)發(fā)默認(rèn)分支,可以忽略下面的 開(kāi)辟我們本地分支 過(guò)程,但是開(kāi)發(fā)開(kāi)源庫(kù),肯定避免不了切換不同的分支,還是建議跟著下面的操作執(zhí)行一下。
開(kāi)辟我們本地分支:
假設(shè)要開(kāi)發(fā) vue 庫(kù)中的 weex 分支,這個(gè)時(shí)候需要借助 origin/weex 分支去開(kāi)辟一個(gè)本地的新分支。origin/weex 就是自己 github 上的 vue 倉(cāng)庫(kù)中 weex 分支。
# 查看具體有哪些分支
git branch -r
# 這個(gè)時(shí)候會(huì)將我們本地分支,自己 github 倉(cāng)庫(kù)分支都列出來(lái)。
# 這里就不截圖了,我們找到 origin/weex 分支,切換過(guò)去。
git checkout origin/weex
# 這里不用管 git 提示,我們只是借助一下這個(gè)分支
# 接下來(lái)我們使用 origin/weex 分支,開(kāi)辟一個(gè)我們本地的新分支
git checkout -b weex

這個(gè)時(shí)候就有了本地的 weex 分支,來(lái)改動(dòng)點(diǎn)東西,執(zhí)行一下最熟悉的 git 提交代碼的過(guò)程。
一頓操作之后(其實(shí)我只是簡(jiǎn)單改了說(shuō)明文檔,?),我們開(kāi)始提交修改的代碼。
# 下面這些就不介紹了,大家都知道
git status
git add .
git commit -m "修改說(shuō)明文檔"
git push --set-upstream origin weex
這個(gè)時(shí)候上自己的 github 上就可以看到自己提交的代碼和分支了。
這個(gè)時(shí)候其實(shí)可以進(jìn)行 pr,但是我們不能這么草率,畢竟這是給開(kāi)源庫(kù)提 pr,我們要小心翼翼,萬(wàn)一提上去一個(gè)審核不通過(guò)的,多尷尬。所以還有一些問(wèn)題需要給大家交代一下。有些看官可能覺(jué)得我問(wèn)題很多,但是這不是為了讓大家更瀟灑的提 pr 嗎,所以有問(wèn)題還是要說(shuō)清楚的。
一個(gè)開(kāi)源庫(kù),是有很多人一起開(kāi)發(fā)的,我們目前開(kāi)發(fā) weex 分支,有其他人可能在你 fork 庫(kù)之后,在你提 pr 之前提交了 weex 分支新修改,但是這個(gè)時(shí)候你本地庫(kù)和你 github 倉(cāng)庫(kù)里面的代碼都是舊的,這個(gè)時(shí)候你如果將剛才修改的代碼提交到遠(yuǎn)程倉(cāng)庫(kù),就會(huì)審核不通過(guò),那上面一頓操作就相當(dāng)于白瞎了,還丟人。
接下來(lái)就說(shuō)如何解決這個(gè)問(wèn)題。
4. 關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù),保證代碼可以和遠(yuǎn)程同步
首先來(lái)看一下本地倉(cāng)庫(kù)有哪些關(guān)聯(lián)的倉(cāng)庫(kù):
# 查看當(dāng)前關(guān)聯(lián)的倉(cāng)庫(kù)
git remote -v

因?yàn)楸镜貍}(cāng)庫(kù)代碼是剛拉下來(lái),所以除了自己 github 的倉(cāng)庫(kù)以外,沒(méi)有任何關(guān)聯(lián)的倉(cāng)庫(kù)。
這個(gè)時(shí)候我們要將 vue 遠(yuǎn)程倉(cāng)庫(kù)進(jìn)行一個(gè)關(guān)聯(lián):
# 進(jìn)行關(guān)聯(lián)
# git remote add 遠(yuǎn)程倉(cāng)庫(kù)別名 遠(yuǎn)程倉(cāng)庫(kù)地址
git remote add upstream https://github.com/vuejs/vue.git
# 執(zhí)行之后不會(huì)有任何提示
# 再次查看本地相關(guān)聯(lián)的遠(yuǎn)程庫(kù)
git remote -v

這個(gè)時(shí)候就關(guān)聯(lián)上了 vue 遠(yuǎn)程倉(cāng)庫(kù)。
接下來(lái)使用 fetch 命令,把遠(yuǎn)程倉(cāng)庫(kù)最新的代碼及分支拉取一下。
# git fetch 關(guān)聯(lián)的別名
git fetch upstream
執(zhí)行之后,我們可以看到把 vue 遠(yuǎn)程倉(cāng)庫(kù)的所有分支代碼都拉下來(lái)了。

后續(xù)我們?cè)谛薷牧四硞€(gè)分支的代碼進(jìn)行提交時(shí),一定要將遠(yuǎn)端的倉(cāng)庫(kù)進(jìn)行一個(gè)合并,我們可以使用下面的命令實(shí)現(xiàn)合并:
# git merge 遠(yuǎn)程倉(cāng)庫(kù)的別名/分支名
git merge upstream/weex
如果沒(méi)有改動(dòng),我們可以直接進(jìn)行 pr;如果有改動(dòng),我們需要將合并的代碼,也提交到我們自己 github 的倉(cāng)庫(kù)中,這樣我們本地代碼、自己遠(yuǎn)程倉(cāng)庫(kù)代碼就和開(kāi)源庫(kù) vue 原始倉(cāng)庫(kù)代碼進(jìn)行了同步。
記得在合并遠(yuǎn)程倉(cāng)庫(kù)代碼的時(shí)候一定要先 fetch。
git fetch upstream
git merge upstream/分支
5. 提交 pr
經(jīng)過(guò)同步遠(yuǎn)程代碼和提交自己修改的代碼之后,我們就可以提交 pr 了,具體操作如下:
上自己的 github 上,如果是第一次提交非默認(rèn)分支的代碼,我們可以直接點(diǎn)擊下圖中的 Compare&pull request 按鈕。

如果是提交已經(jīng)存在的分支,比如默認(rèn)分支,或者某個(gè)二次提交的分支,這個(gè)時(shí)候我們可以直接點(diǎn)擊 Newpull request 按鈕。
不管是上面那種方式,都會(huì)跳轉(zhuǎn)到提交 pr 的界面:
前面的紅框代表了要給哪個(gè)開(kāi)源庫(kù)哪個(gè)分支提交 pr,后面這個(gè)紅框代表你要將哪個(gè)項(xiàng)目哪個(gè)分支給提交上去。
一定要選擇對(duì),別提交錯(cuò)了,提交錯(cuò)了一般人也不會(huì)給你合并的。
最后點(diǎn)擊 Createpull request 按鈕。
這樣就大功告成了,等著開(kāi)源庫(kù)的作者給你合并 pr 吧,初次提交 pr 的喜悅還是很棒的。
總結(jié)
在編寫代碼之前,一定要確定好自己要給哪個(gè)分支提交 pr,并且要在對(duì)應(yīng)分支的基礎(chǔ)上再創(chuàng)建自己本地的分支,否則合并原始倉(cāng)庫(kù)分支代碼時(shí),分支不同,會(huì)有很多沖突。
舉個(gè)例子:你想開(kāi)發(fā) vue 的 weex,但是 vue 倉(cāng)庫(kù)默認(rèn)分支是 dev,你沒(méi)有根據(jù)
origin/weex分支去創(chuàng)建本地分支,你直接在 dev 分支上合并了原始倉(cāng)庫(kù)的 weex 分支(git merge upstream/weex),這個(gè)時(shí)候就會(huì)有很多沖突,就算你解決掉了,你提交代碼也不會(huì)有人給你通過(guò)。
給開(kāi)源庫(kù)提 pr 的前提一定是要好好熟悉代碼,不要瞎提,瞎提肯定不會(huì)有人給你合并,給開(kāi)源庫(kù)提 pr,如果被合并了,后續(xù)在你自己簡(jiǎn)歷里邊也是一個(gè)加分項(xiàng),而且想給開(kāi)源庫(kù)提交 pr,會(huì)強(qiáng)制我們熟讀代碼,這樣也能提升我們自己的基礎(chǔ)。
有更好的辦法,希望大家評(píng)論指出來(lái),一起探討,為了大家共同成長(zhǎng)
如果你喜歡探討技術(shù),或者對(duì)本文有任何的意見(jiàn)或建議,非常歡迎加魚頭微信好友一起探討,當(dāng)然,魚頭也非常希望能跟你一起聊生活,聊愛(ài)好,談天說(shuō)地。魚頭的微信號(hào)是:krisChans95 也可以掃碼關(guān)注公眾號(hào),訂閱更多精彩內(nèi)容。
