git merge使用不當引發(fā)的代碼丟失血案

原文: git merge使用不當引發(fā)的代碼丟失血案@blog.23lab.com

背景

幾年前大批量的團隊都在轉(zhuǎn)用git忆畅,git的本地庫和分支特性讓代碼管理的便利性大大增加蔑祟,也因為本地庫和分支的大批量使用導致了代碼之間的頻繁merge光稼,我們團隊以前就有遇到過git merge以后丟代碼的情況,表現(xiàn)就是某些變更開發(fā)A提交了,經(jīng)過中間以序列的commit, merge掰曾,push,最終某些改動沒了停团,去看commit history旷坦,也沒有相應(yīng)的變更記錄。一次次commit對比以后總是會找到某次的merge佑稠,但是也沒法解釋為什么會丟秒梅,最后為了保險通常會選擇beyond compare全量對比一次確保所有丟失的代碼找回來,那是一個痛苦而又讓人睡不安穩(wěn)的解決辦法舌胶。

今天又遇到了一次這個問題番电,這次的更加詭異,在我查為什么丟的時候辆琅,另外一個同事提交代碼以后竟然丟失的代碼回來了漱办,我當時腦袋里面只想到一個詞,那就是: 見鬼婉烟。但是冷靜下來想娩井,git這種工具出現(xiàn)真丟代碼的概率肯定很小,肯定是我們姿勢不對似袁。于是認認真真的研究了我們今天的提交記錄洞辣,終于找到答案,就是git merge后只提交部分代碼導致的昙衅,這里順帶提一下扬霜,git pull等于git fetch + git merge,所以git pull時也需要特別關(guān)注本文提到的問題而涉。

驗證過程

為了驗證這個問題著瓶,我建了一個全新的git庫來復現(xiàn)上述問題,根據(jù)我們遇到的情況模擬啼县,整個過程我使用三個用戶模擬交叉提交和合并材原,分別是user1,user2季眷,user3余蟹,為了方便我沒有選擇注冊三個號,而是在提交信息里面都帶上了名字子刮,可以制造兩次代碼沖突威酒,并且兩次都進行部分提交。最終的代碼提交記錄如下:

image.png

為了更清晰的看到這個提交過程挺峡,我將三個用戶的提交分開來葵孤,并根據(jù)提交先后做了下面的圖。


image.png

代碼怎么丟的沙郭?

首先佛呻,第1步和第2步,user1和user2分別在本地做修改病线,共同修改了file1吓著,只有user2對file2也做了修改,所以如果這兩人的代碼合并送挑,可以預計合并的時file1會沖突绑莺,file2不會。user2修改完成以后做了一次git push惕耕,這時候git遠端庫的head應(yīng)該是指向user2的最后一次提交的纺裁。接著user1做git pull,因為file1被兩個用戶修改了,所以需要合并欺缘,接著user1處理完沖突以后只提交了file1栋豫,沒有提交file2(用命令行需要手動reset,但是用有些GUI工具是可以選擇只提交file1的)谚殊。此時的庫已經(jīng)丟失了user2:file2:add line的那次改動丧鸯,這就是血案的開始,丟代碼嫩絮〈灾可以對比一下 merge前merge后

代碼怎么"恢復"的剿干?

前面只是驗證了代碼怎么丟蜂怎,但是事情沒有結(jié)束,我上面提到更詭異的是代碼恢復了置尔,這又是怎么回事呢杠步?user1在第3步合完代碼以后,自己進行了兩次提交撰洗,修改了file3和file1篮愉,同時,user3加入并本地修改了file1(預計會和user1沖突)差导,接著user1git push试躏,然后user3 git pull,這時候會報file1沖突设褐,同樣颠蕴,user3犯了user1類似的錯誤,只提交了沖突文件file1助析。按第3步丟代碼的經(jīng)驗犀被,file3的改動肯定是沒有了,驗證以后確實如此外冀,但是再看看file2的變更呢寡键,它竟然又回來了,所以所謂的恢復不是恢復雪隧,所謂的丟失沒有丟失西轩,就問你怕不怕。更可怕的是我們再去看file2的變更歷史脑沿。

image.png

中間消失和恢復的過程沒有任何變更記錄藕畔,這也是之前我們經(jīng)常查到?jīng)]法往下查到地方。從表現(xiàn)上看庄拇,是第一次誤操作忽略了這一行的變更注服,而第二次誤操作韭邓,可以理解為是忽略了忽略添加這一行的那一次變更,但是溶弟,所有的都沒有記錄女淑。

總結(jié)

上面的實驗可能看起來有點繁瑣,總結(jié)一下可很,核心的問題就是不要在git merge的時候只提交部分代碼诗力,特別是好多人剛剛用git的時候,運行完成一次git merge我抠,發(fā)現(xiàn)自己修改了1個文件,結(jié)果git提示要提交100個袜茧,這時候小心謹慎的新同學就會選擇只提交自己的變動吧菜拓,殊不知這是在犯大錯啊。除了這種情況笛厦,之前還遇到有的新同學會修改git默認生成的merge信息纳鼎,這也是非常不好的習慣,改了以后在查問題的時候沒辦法很容易的看到哪些是merge裳凸。所以請注意:

  • git merge以后不要部分提交<伞!

  • git merge以后不要部分提交R坦取逗宁!

  • git merge以后不要部分提交!梦湘!

  • git merge的信息不要手動改O箍拧!

  • git merge的信息不要手動改0埔椤哼拔!

  • git merge的信息不要手動改!瓣颅!

文中提到的實驗庫的地址是: find-the-missing-code, 有興趣的童鞋可以自己詳細看一下倦逐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宫补,隨后出現(xiàn)的幾起案子檬姥,更是在濱河造成了極大的恐慌,老刑警劉巖守谓,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穿铆,死亡現(xiàn)場離奇詭異,居然都是意外死亡斋荞,警方通過查閱死者的電腦和手機荞雏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凤优,你說我怎么就攤上這事悦陋。” “怎么了筑辨?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵俺驶,是天一觀的道長。 經(jīng)常有香客問我棍辕,道長暮现,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任楚昭,我火速辦了婚禮栖袋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抚太。我一直安慰自己塘幅,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布尿贫。 她就那樣靜靜地躺著电媳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庆亡。 梳的紋絲不亂的頭發(fā)上匾乓,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音身冀,去河邊找鬼钝尸。 笑死,一個胖子當著我的面吹牛搂根,可吹牛的內(nèi)容都是我干的珍促。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剩愧,長吁一口氣:“原來是場噩夢啊……” “哼猪叙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仁卷,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤穴翩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锦积,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芒帕,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年丰介,在試婚紗的時候發(fā)現(xiàn)自己被綠了背蟆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鉴分。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖带膀,靈堂內(nèi)的尸體忽然破棺而出志珍,到底是詐尸還是另有隱情,我是刑警寧澤垛叨,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布伦糯,位于F島的核電站,受9級特大地震影響嗽元,放射性物質(zhì)發(fā)生泄漏敛纲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一还棱、第九天 我趴在偏房一處隱蔽的房頂上張望载慈。 院中可真熱鬧,春花似錦珍手、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秤茅,卻和暖如春稚补,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背框喳。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工课幕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人五垮。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓乍惊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親放仗。 傳聞我的和親對象是個殘疾皇子润绎,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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

  • 第一部分是文檔,為了日后查看方便放到了前邊[可能敲錯了诞挨,詳見阮一峰老師的文章]http://www.ruanyif...
    白璞1024閱讀 1,020評論 0 49
  • 以下筆記主要參考gitgot莉撇,大致了解git使用和原理。 第一部分我們從個人的視角去研究如何用好Git惶傻,并且揭示G...
    carolwhite閱讀 2,379評論 0 1
  • "常見機器學習算法實現(xiàn)代碼(DeepLearning Tutorials/PCA/kNN/logistic reg...
    hzyido閱讀 1,086評論 0 1
  • 嗨棍郎,你好哇! 不知道你現(xiàn)在在哪,在做些什么呢! 倘若你的身邊是另外一個女孩银室,我也不會感到難過或生氣:我這么死心塌地...
    楊爽blue閱讀 1,132評論 6 10