游戲上線標(biāo)準(zhǔn)之git分支模型县袱,cherry-pick#ABA問(wèn)題

  1. 場(chǎng)景復(fù)現(xiàn)

    a. 原始A分支有一個(gè)file,里面有一行,"hello,world1"

    b. 切出新的B分支享扔,此時(shí)B分支和A分支內(nèi)容一樣趟庄,都只有一行

    c. 切回A分支括细,file增加一行伪很,“hello,world2”戚啥,此時(shí)A分支有兩行

    d. 切回B分支,cherry-pick A分支剛才的commit锉试,此時(shí)B分支也有兩行

    d. B分支將“hello,world2”這行刪除

    e. A分支合并B分支

    提問(wèn):

    此時(shí)A分支file中應(yīng)該有幾行猫十??jī)?nèi)容是什么?

  2. 類似的一個(gè)場(chǎng)景

    a. 原始A分支有一個(gè)file呆盖,里面有一行,"hello,world1"

    b. 切出新的B分支拖云,此時(shí)B分支和A分支內(nèi)容一樣,都只有一行

    c. 切回A分支应又,刪除這一行宙项,此時(shí)A分支的file一行都沒(méi)有

    d. A分支合并B分支

    提問(wèn):

    此時(shí)A分支file中應(yīng)該有幾行??jī)?nèi)容是什么株扛?

  3. 先揭曉答案

    • 第一個(gè)場(chǎng)景尤筐,A分支file最終的內(nèi)容是有2行

      hello,world1
      hello,world2
      
    • 第二個(gè)場(chǎng)景,A分支file最終的內(nèi)容是1L都沒(méi)有

  4. 原因分析

    • git的分支合并主要是采用三路合并洞就,通過(guò)比較共同的祖先盆繁,生成合并結(jié)果
    • 對(duì)于第一個(gè)場(chǎng)景
      • A分支相對(duì)于共同的祖先,是增加了一行旬蟋,變化了油昂,所以合并
      • B分支做了一頓操作,但是最后結(jié)果是相對(duì)于祖先倾贰,沒(méi)有變化冕碟,所以不合并
      • 所以最終合并結(jié)果就是2L
    • 對(duì)于第二個(gè)場(chǎng)景
      • A分支相對(duì)于共同的祖先,刪除了一行匆浙,變化了安寺,所以合并
      • B分支相對(duì)共同的祖先,什么都沒(méi)變化吞彤,所以不合
      • 所以最終合并結(jié)果就是0L
    • 所以三路合并歸根是跟祖先的commit做對(duì)比我衬,雙方都有不同的變化則都會(huì)合進(jìn)來(lái),如果變化的是相同的文件則如可能出現(xiàn)沖突饰恕,交由用戶自行解決
  5. 繼續(xù)分析第一個(gè)場(chǎng)景

    • 現(xiàn)實(shí)中這個(gè)場(chǎng)景

      1. master分支是主干分支挠羔,是進(jìn)行最新版本的內(nèi)容開(kāi)發(fā),包含了許多新版本內(nèi)容

      2. pre-release分支是預(yù)發(fā)布分支埋嵌,主要是當(dāng)前線上版本內(nèi)容

      3. 當(dāng)master分支發(fā)現(xiàn)了一個(gè)bug后破加,fix后,通常是通過(guò)cherry-pick到pre-release分支

      4. 但是pre-release分支發(fā)現(xiàn)bug沒(méi)有解決雹嗦,又繼續(xù)在pre-release修改范舀,如刪除

      5. 再merge回master合是,就可能出現(xiàn)場(chǎng)景中的問(wèn)題

    • 但相對(duì)來(lái)說(shuō),這種情況出現(xiàn)的概率較低

    • 但是確實(shí)潛在隱患

  6. 讓我們換一種思路解決

    1. master分支file有一行"hello,world"

    2. 切pre-release分支

    3. master發(fā)現(xiàn)bug

      此時(shí)從master切一個(gè)bug_fix分支锭环,修復(fù)bug聪全,如增加"hello,fix bug"

    4. 將bug_fix分支分別合并到master和pre-release

      注意:git merge --no-ff -m "merge from bug-fix" bug-fix,加上--no-ff參數(shù)

    5. 此時(shí)pre-release分支發(fā)現(xiàn)有問(wèn)題辅辩,直接再該分支修改难礼,刪除了"hello,fix bug"這一行

    6. pre-release合回master

    7. 提問(wèn):此時(shí)master file的內(nèi)容是什么呢?

      • 此時(shí)file的內(nèi)容就是"hello,world"
    8. 原因:

      • 根據(jù)三路合并玫锋,在合并分支的時(shí)候,master和pre-release的祖先提交都是merge bug-fix那個(gè)commit
      • 而對(duì)比后蛾茉,發(fā)現(xiàn)master沒(méi)有變化,而pre-release刪除了一行
      • 則最終合并是把pre-relese的變化合并過(guò)來(lái)了
    9. 對(duì)比cherry-pick

      • 最大的不同點(diǎn)是bug_fix合并的時(shí)候在master/pre-release生成了共同的有關(guān)聯(lián)的commit
      • 而如果直接從master cherry-pick到pre-release撩鹿,是生成一個(gè)新的commit谦炬,而這個(gè)commit和原來(lái)之前master的commit沒(méi)有任何關(guān)系。所以三路合并的時(shí)候要繼續(xù)找祖先...
    10. 注意:

      • 這只是一個(gè)sample节沦,因?yàn)閷?shí)際上應(yīng)該要在pre-release切分支键思,如果在mater切,則會(huì)把master的版本內(nèi)容merge到pre-release
    11. 其他的辦法

      • 保證對(duì)于同一個(gè)bug的修改一定要在同一分支修改...
  7. 已經(jīng)有先例了

  8. 初步結(jié)論

    • 使用cherry-pick存在ABA問(wèn)題

      • cherry-pick-aba.png
  • 如果在master發(fā)現(xiàn)線上的bug纬乍,則不直接在master修改

  • 而是在pre-relese分支創(chuàng)建一個(gè)bug-fix分支,修改裸卫,然后分別合并到master/pre-release

    如果可以在pre-release修改仿贬,就改完后直接合回master

    注:正式線上會(huì)是online

  • 或者說(shuō)

    1. master發(fā)現(xiàn)bug,fixed了一個(gè)commit
    2. cherry-pick到pre-release了
    3. 如果此時(shí)pre-release發(fā)現(xiàn)該bug還有問(wèn)題墓贿,需要繼續(xù)修改
    • 那么先在pre-release切一個(gè)bug-fix分支茧泪,先分別合并一次
    • 在bug-fix上繼續(xù)修改,修正后再合并
  • 或者說(shuō)從master cherry pick到pre-release

    • 加上-x選項(xiàng) 即git cherry-pick -x commitId
    • (cherry picked from commit ...)
    • 在pre-release分支向master分支合并的時(shí)候關(guān)注一下原始的commit是否出現(xiàn)ABA問(wèn)題聋袋,做一下相關(guān)檢查即可
  1. 2019.9.29 討論結(jié)果

    • 遇到一個(gè)bug队伟,優(yōu)先在線上分支修改
      • online切bug-fix分支
      • pre-release根據(jù)選擇是切分支還是直接在pre-release修改
      • pre-release可以直接合并回master
    • 放棄在master修改bug,然后cherry-pick
      • 因?yàn)閏herry-pick的ABA問(wèn)題
    • 客戶端之前的做法是master和pre-release相互cherry-pick幽勒,不merge嗜侮,也沒(méi)問(wèn)題(只要cherry-pick和merge不一起)
    • 如果一定要使用cherry-pick,一定要注意問(wèn)題(ABA問(wèn)題,不和merge一起锈颗,-x選項(xiàng)等)
    • 一定要理解git的三路合并原理
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顷霹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子击吱,更是在濱河造成了極大的恐慌淋淀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姨拥,死亡現(xiàn)場(chǎng)離奇詭異绅喉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)叫乌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)徽缚,“玉大人憨奸,你說(shuō)我怎么就攤上這事≡涫裕” “怎么了排宰?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)那婉。 經(jīng)常有香客問(wèn)我板甘,道長(zhǎng),這世上最難降的妖魔是什么详炬? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任盐类,我火速辦了婚禮,結(jié)果婚禮上呛谜,老公的妹妹穿的比我還像新娘在跳。我一直安慰自己,他們只是感情好隐岛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布猫妙。 她就那樣靜靜地躺著,像睡著了一般聚凹。 火紅的嫁衣襯著肌膚如雪割坠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天妒牙,我揣著相機(jī)與錄音彼哼,去河邊找鬼。 笑死单旁,一個(gè)胖子當(dāng)著我的面吹牛沪羔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蔫饰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琅豆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起篓吁,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茫因,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后杖剪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體冻押,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盛嘿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洛巢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡次兆,死狀恐怖稿茉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芥炭,我是刑警寧澤漓库,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站园蝠,受9級(jí)特大地震影響渺蒿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彪薛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一茂装、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陪汽,春花似錦训唱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至训挡,卻和暖如春澳骤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澜薄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工为肮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肤京。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓颊艳,卻偏偏與公主長(zhǎng)得像茅特,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棋枕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348