吵瘋了,Pull Request到底是個(gè)啥?
本文轉(zhuǎn)載自微信公眾號(hào)「愛(ài)笑的架構(gòu)師」,作者雷架 。轉(zhuǎn)載本文請(qǐng)聯(lián)系愛(ài)笑的架構(gòu)師公眾號(hào)。
在團(tuán)隊(duì)中我承擔(dān)了Committer 的責(zé)任,也就是幫同事們檢視代碼(Code Review)和合入代碼,經(jīng)常聽(tīng)到有同事在群里喊:“大佬,幫我合個(gè) PR”,“大佬,我剛提交了一個(gè) MR,幫忙合一下,急著出補(bǔ)丁”。我有點(diǎn)懵了,PR 和 MR 到底哪個(gè)才是正確的,這兩個(gè)到底有什么區(qū)別,我決定先搞清楚這兩個(gè)概念再合入他們的代碼。[手動(dòng)滑稽]
什么是Pull Request?
PR 的全稱是Pull Request,經(jīng)常用 Github 的同學(xué)對(duì)這個(gè)肯定很熟悉了。Github 聚集了4000萬(wàn)開(kāi)發(fā)者,過(guò)億的開(kāi)源項(xiàng)目,如果想給別人的開(kāi)源倉(cāng)庫(kù)貢獻(xiàn)代碼,通常是先 fork 別人的項(xiàng)目,然后本地修改完成提交到自己的個(gè)人 fork 倉(cāng)庫(kù),最后提交 PR 等待別人合入你的代碼。
Github 的工作流:
fork 工作流
我們重點(diǎn)看一下第6步,小明寫(xiě)完代碼了想合入到原作者的倉(cāng)庫(kù),新建了一個(gè)“pull request”,拉請(qǐng)求?這明明是推啊,小明將自己的修改推到原作者的倉(cāng),感覺(jué)叫“push request”比較合適吧。
既然 Github 堅(jiān)持叫“pull request”,我們?cè)囍斫庖幌滤乃悸罚∶鲗?xiě)完代碼了心里肯定是在想:原作者大神,我改了點(diǎn)東西,你快把我的修改拉回去吧。站在原作者的角度思考,叫pull request好像也說(shuō)得過(guò)去,每天有大量的人從我這里 fork 代碼走,我只會(huì)拉取我感興趣的代碼回來(lái)。
我好像把自己說(shuō)服了。
什么是 Merge Request?
MR 的全稱是 Merge Request,相信玩過(guò) Gitlab 的同學(xué)都知道這個(gè)。
插播一下,Github這么好用了為什么還有人玩 Gitlab,這就要幾年前說(shuō)起了。在微軟沒(méi)有收購(gòu) Github 之前,Github 上面所有的項(xiàng)目必須是公開(kāi)的,也就是說(shuō)自己很渣的代碼也必須要公開(kāi),不能藏著噎著。但是在一些小的公司或者創(chuàng)業(yè)團(tuán)隊(duì),代碼這種核心資產(chǎn)是不希望被公開(kāi),他們迫切需要私密倉(cāng)這種需求,所以很多人都選擇了 Gitlab。當(dāng)然后面 Github 也放開(kāi)了私有倉(cāng)庫(kù),這是后話了。
merge 工作流
團(tuán)隊(duì)中每個(gè)人都從遠(yuǎn)程倉(cāng)庫(kù) develop 分支拉取代碼,本地基于 develop 分支新建特性分支,修改完代碼將特性分支推到遠(yuǎn)程倉(cāng),緊接著新建 Merge Request 期望將自己的特性分支合入 develop 分支。
從上面這個(gè)流程來(lái)看Merge Request 就是將自己的特性分支合入到主干分支。
Pull Request VS Merge Request
總結(jié)一下上面兩個(gè)例子。
Github 是玩 fork 模式的,開(kāi)發(fā)者提交自己的代碼新建 Pull Request,請(qǐng)求原作者:“把我的代碼拉回去吧”。
Gitlab 是玩分支模式的,開(kāi)發(fā)者提交自己的代碼新建 Merge Request,想將自己的特性分支合并到主干。
上面總結(jié)的好像很有道理,但是不要忘了,Github 也可以玩分支模式,Gitlab 也可以玩 fork 模式,更令人無(wú)語(yǔ)的是:
Github 上合并分支還是叫 Pull Request;Gitlab 上fork 模式也是叫 Merge Request;
不行,這種答案我沒(méi)法接受,去 stackoverflow上搜一些大家是怎么理解的。果然有一個(gè)帖子很火:
Pull request vs Merge request
有一個(gè)回答摘取了 Gitlab 的官方解釋:
Merge or pull requests are created in a git management application and ask an assigned person to merge two branches. Tools such as GitHub and Bitbucket choose the name pull request since the first manual action would be to pull the feature branch. Tools such as GitLab and Gitorious choose the name merge request since that is the final action that is requested of the assignee. In this article we'll refer to them as merge requests.
翻譯過(guò)來(lái)簡(jiǎn)單理解就是:這兩個(gè)沒(méi)有本質(zhì)區(qū)別,站在不同立場(chǎng)說(shuō)法不一樣而已。
好了,官方已經(jīng)蓋棺定論了,這兩個(gè)就是一個(gè)東西,不要糾結(jié)啦~
瘋狂吐槽
對(duì)于初學(xué)者來(lái)說(shuō),Github 的 pull request 確實(shí)讓人難以理解,我們?nèi)ジ鞔缶W(wǎng)站看看用戶的聲音。
StackOverflow
圖片
知乎
從國(guó)外到國(guó)內(nèi)都有大量的用戶對(duì)這個(gè)名字不理解,明明是提交提交代碼,為什么是 pull request,有些人甚至懷疑是名字打錯(cuò)了。
如果讓我來(lái)給 Github 取名字,我可能會(huì)?。?/p>
push request 推請(qǐng)求
merge request 合并請(qǐng)求
想多了,不會(huì)有如果。[嘿哈]
總結(jié)
Pull Request 和Merge Request 本質(zhì)上都是合入代碼,只是站在不同角度有不同的說(shuō)法而已,因此在學(xué)習(xí)和工作中無(wú)論用哪一個(gè)都沒(méi)有問(wèn)題。
另外,一個(gè)好的名字對(duì)于新手理解這項(xiàng)技術(shù)或者業(yè)務(wù)非常有幫助,比如看到“反向代理”這個(gè)名詞很多新手是懵的,大家還遇到哪些難以理解的詞歡迎在留言區(qū)討論和吐槽。