合并Spark社區(qū)代碼的正確姿勢(shì)

原創(chuàng)文章傻谁,轉(zhuǎn)載請(qǐng)保留出處

最近剛剛忙完Spark 2.2.0的性能測(cè)試及Bug修復(fù),社區(qū)又要發(fā)布2.1.2了,國(guó)慶期間剛好有空岂座,過(guò)了一遍2.1.2的相關(guān)JIRA步绸,發(fā)現(xiàn)有不少重要修復(fù)2.2.0也能用上,接下來(lái)需要將有用的PR合到我們內(nèi)部維護(hù)的2.2.0分支上了瓤介。

經(jīng)常有朋友問(wèn)我是怎么把社區(qū)的PR合到自己分支上的,我之前跟他們介紹的做法是基于PR拉分支氯质,在IDEA中單個(gè)文件diff合并祠斧。如果是偶爾合下社區(qū)代碼,這種方式也不算太費(fèi)事琢锋。但是如果PR中改動(dòng)的文件較多,或者要合并多個(gè)PR過(guò)來(lái)钉嘹,這種方式也挺麻煩鲸阻。

廢話(huà)到此,這篇文章是介紹鸟悴,如何高效地合并Spark社區(qū)PR到自己維護(hù)的分支(常說(shuō)的打Patch),當(dāng)然沛贪,針對(duì)其他開(kāi)源項(xiàng)目震贵,該方法同樣適用。

PR:Pull Request是GitHub上的一個(gè)功能屏歹,開(kāi)源代碼的貢獻(xiàn)者,通過(guò)發(fā)起一個(gè)Pull Request向社區(qū)貢獻(xiàn)代碼季希。

準(zhǔn)備Spark代碼

一般來(lái)說(shuō),自己維護(hù)一套Spark代碼式塌,需要Fork下社區(qū)項(xiàng)目峰尝,在clone自己Fork的代碼,進(jìn)行開(kāi)發(fā)武学。我這里以Spark 2.2.0為例祭往。

  1. clone自己Fork的倉(cāng)庫(kù)到本地

    # stanzhai是我的GitHub賬號(hào),大家需要換成自己的倉(cāng)庫(kù)地址
    git clone https://github.com/stanzhai/spark.git
    cd spark
    
  2. 添加一個(gè)名為upstream的遠(yuǎn)程倉(cāng)庫(kù)指向社區(qū)的版本庫(kù)

    git remote add upstream https://github.com/apache/spark.git
    
  3. 設(shè)置PR引用硼补,編輯git配置vi .git/config熏矿,找到upstream,添加最后一行fetch

    [remote "upstream"]
        url = https://github.com/apache/spark.git
        fetch = +refs/heads/*:refs/remotes/upstream/*
        fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*  # 注意添加這行
    
  4. 同步遠(yuǎn)端庫(kù)票编,更新分支引用(每次合并前都需要執(zhí)行)

    git remote update
    
  5. checkout一個(gè)2.2.0的維護(hù)分支

    git checkout -b my-2.2.0 v2.2.0
    

我們創(chuàng)建了一個(gè)基于2.2.0的my-2.2.0分支慧域,下面的示例是將社區(qū)PR合并到my-2.2.0分支中。

提交給社區(qū)的PR大致分為2類(lèi):

  1. PR被接受吊趾,且被合并到社區(qū)的倉(cāng)庫(kù)
  2. PR沒(méi)有合并到社區(qū)倉(cāng)庫(kù)瑟啃,(代碼沒(méi)問(wèn)題,有可能commiter還沒(méi)來(lái)得及處理)

整合已被社區(qū)合并的PR

被合并到社區(qū)的PR已經(jīng)做了rebase處理屁奏,對(duì)于這種PR错负,合并到自己的分支中是非常簡(jiǎn)單的事情,直接使用git的cherry-pick就可以搞定犹撒。

我們以這個(gè)卡片為例:https://issues.apache.org/jira/browse/SPARK-22083

這個(gè)卡片被標(biāo)記為resolved,而且PR也被合到社區(qū)倉(cāng)庫(kù)了:https://github.com/apache/spark/pull/19311诚镰,我們打開(kāi)這個(gè)鏈接,到頁(yè)面下方清笨,找到這個(gè)位置:

spark-pr.png

打開(kāi)后抠艾,會(huì)跳轉(zhuǎn)到這個(gè)地址:https://github.com/apache/spark/commit/2c5b9b1173c23f6ca8890817a9a35dc7557b0776,地址中后面的一長(zhǎng)串就是我們需要的commit-id检号,得到這個(gè)就可以直接合并代碼了:

git remote update
git cherry-pick 2c5b9b1173c23f6ca8890817a9a35dc7557b0776

執(zhí)行完谨敛,提示以下信息就表示合并成功了:

?  spark git:(my-2.2.0) ? git cherry-pick 2c5b9b1173c23f6ca8890817a9a35dc7557b0776
[my-2.2.0 529f5ea55ff] [SPARK-22083][CORE] Release locks in MemoryStore.evictBlocksToFreeSpace
 Author: Imran Rashid <irashid@cloudera.com>
 Date: Mon Sep 25 12:02:30 2017 -0700
 2 files changed, 153 insertions(+), 13 deletions(-)

如果合并的代碼恰好也被你改過(guò)了,那么有可能會(huì)出現(xiàn)沖突脸狸,這種情況正常解決沖突,然后git commit就可以了泥彤。

整合尚未合并到社區(qū)的PR

由于一個(gè)PR可能包含多次提交卿啡,整合未合并到社區(qū)的PR就比較麻煩了。Spark的主干代碼每天都有變動(dòng)颈娜,直接對(duì)比兩個(gè)不同的分支變動(dòng)通常會(huì)比較大,我們需要將PR中n次提交的代碼的所有變更梳理出來(lái)蛹磺,然后在做整合同仆。

我們以這個(gè)PR為例:https://github.com/apache/spark/pull/19301,這個(gè)PR實(shí)現(xiàn)上還有待改進(jìn)俗批,但可以正常工作,因此還沒(méi)合入社區(qū)辛慰,我們將這個(gè)PR合并到my-2.2.0分支干像,需要進(jìn)行以下操作:

# 更新遠(yuǎn)程倉(cāng)庫(kù)及版本引用信息
git remote update

# 基于某個(gè)PR創(chuàng)建一個(gè)分支辱志,這里的19301是這個(gè)PR在GitHub上的id
git checkout -b pr-19301 upstream/pr/19301
git checkout pr-19301

# PR分支大都基于master開(kāi)發(fā)狞膘,以u(píng)pstream/master分支為基準(zhǔn),重新apply PR分支上的修改
git rebase upstream/master

# 通過(guò)diff提取這次PR的patch文件
git diff upstream/master > pr-19301.patch

# 到目標(biāo)分支打patch
git checkout my-2.2.0
git apply --reject pr-19301.patch

# 查看上一步apply的狀態(tài)
git status
# apply有可能會(huì)不成功已球,尚未apply的patch被存放到*.rej文件中辅愿,需要手動(dòng)處理,最后提交即可
git commit -a

# 清理
rm pr-19301.patch
rm *.rej
git branch -D pr-19301

參考

最后

上述方法不能保證合PR 100%成功点待,原則上你的分支和社區(qū)代碼約近,沖突越少状原,越容易處理苗踪。Spark 2.x的代碼有很大的變動(dòng),把針對(duì)2.x的PR打到1.6的分支上毕莱,往往是個(gè)麻煩事颅夺。

據(jù)說(shuō)看完這篇文章給個(gè)贊的同學(xué),打Patch都不會(huì)遇到?jīng)_突 (≧▽≦)/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末部服,一起剝皮案震驚了整個(gè)濱河市稚字,隨后出現(xiàn)的幾起案子饲宿,更是在濱河造成了極大的恐慌胆描,老刑警劉巖昌讲,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件短绸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡醋闭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)乐埠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)囚企,“玉大人,你說(shuō)我怎么就攤上這事棵逊∫铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵秸歧,是天一觀的道長(zhǎng)衅澈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)今布,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任侵蒙,我火速辦了婚禮傅蹂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘份蝴。我一直安慰自己,他們只是感情好浸卦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布案糙。 她就那樣靜靜地躺著靴庆,像睡著了一般怒医。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上端礼,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天入录,我揣著相機(jī)與錄音,去河邊找鬼僚稿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缅刽,可吹牛的內(nèi)容都是我干的蠢络。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼啡省,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼髓霞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起方库,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纵潦,失蹤者是張志新(化名)和其女友劉穎徐鹤,沒(méi)想到半個(gè)月后邀层,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡救赐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年经磅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钮追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轧叽,死狀恐怖刊棕,靈堂內(nèi)的尸體忽然破棺而出炭晒,到底是詐尸還是另有隱情甥角,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布震束,位于F島的核電站当犯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嚎卫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一胸懈、第九天 我趴在偏房一處隱蔽的房頂上張望恰响。 院中可真熱鬧,春花似錦胚宦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春侦副,著一層夾襖步出監(jiān)牢的瞬間驼鞭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工译隘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洛心,地道東北人固耘。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓玻驻,卻偏偏與公主長(zhǎng)得像偿枕,于是被迫代替她去往敵國(guó)和親璧瞬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渐夸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,661評(píng)論 9 163
  • 西街故事 當(dāng)21路公交車(chē)再次駛過(guò)西街口時(shí)瘟忱,我趴在窗口,看到了泉州人所津津樂(lè)道的鐘樓访诱,不知是否是我的錯(cuò)覺(jué)韩肝,泉州人很喜...
    細(xì)雨慢煎閱讀 1,157評(píng)論 2 6
  • 如今我二十了,每當(dāng)我看到類(lèi)似的東西催蝗,或經(jīng)歷類(lèi)似的事兒,還是忍不住淚目丙号。 我想狗是最通人性的動(dòng)物了,它不是除人之外最...
    糖點(diǎn)什么閱讀 551評(píng)論 0 0
  • 培訓(xùn)心得 想不到三個(gè)月如此快喳魏,又到了第二期的培訓(xùn)遍尺〗乜幔看著培訓(xùn)表的課程安排乾戏,內(nèi)心是抗拒的三热,因?yàn)檫@次的兩門(mén)課都不是我所...
    94f8e6767b72閱讀 214評(píng)論 0 0
  • 在農(nóng)村,逢季就能吃到老黃瓜燉泥鰍呐能,那滋味美的不用說(shuō),吃過(guò)的人都知道摆出。每到夏天首妖,菜園子里的黃瓜遍地都是,隨便扯一個(gè)有缆,...
    Methinks張齊閱讀 358評(píng)論 0 1