解決git revert帶來的代碼消失問題

一、背景:

??今天將一段代碼合入了master,上線的時候有問題,而不能很快解決掉蒙具,為了不影響其他同事合入master或將有問題的commit帶上線,因此我將我的commit revert掉了峰弹。
??同時店量,當天晚上的時候有同事剛好問我git revert后自己代碼消失的問題芜果,當時思考不清晰鞠呈,也比較少用revert,因此現在來復盤下右钾。
??commit提交流程示意圖如下:

revert流程

其中A是有問題的commit蚁吝,R是revert的commit,M是master舀射,序號N代表master的流向


??如果我在commitA上rebase M3的代碼時窘茁,會發(fā)現代碼沒有變動,或者說在commitA中修改了部分內容再提交脆烟,A中的代碼合入master后還是消失了山林。



二、原因:

git合并歷史commit

??如果合并一個歷史commit邢羔,會以master的git歷史圖為準驼抹。
??原因是無論是merge還是rebase,都會先找到兩個分支的公共節(jié)拜鹤,再進行相應的合并操作框冀。但是歷史commit肯定是master的commit的父節(jié)點,所以兩個分支的公共節(jié)點必定就是歷史commit本身敏簿,所以rebase跟merge只會合并公共節(jié)點之后的commit明也,HEAD就只進行FastForward宣虾,最終跟master保持一致。

示意圖如下:
git提交歷史commit


三温数、解決辦法

1. git revert VS git reset

??當想要修改有問題的遠程分支時绣硝,我們需要回退到沒有合入主分支的版本,該怎么做呢撑刺?
??git revert與git reset都能幫助我們解決問題域那,但是適用的場景不盡相同。

(1)git reset

??git reset的作用就在于重新設置HEAD猜煮,由于每次提交都會產生一個commit次员,我們用reset的時候可以制定我們要回退的歷史版本commit,如:

git reset --hard commitA
git reset --soft commitB
  • hard 參數代表強重置王带,廢棄所有的提交淑蔚,因此會有代碼消失的風險,使用時需謹慎
  • soft 參數代表弱重置愕撰,保留指定歷史commit之后所有的修改刹衫,并存放在暫存區(qū)(相當于git add .)
(2) git revert

??git revert實際就是將你merge到master的所有commit進行反向操作,并將所有的操作合并成一個commit搞挣,無論原本commit有多少带迟,都只會產生一個commit,命令如下:

git revert commitA

??操作完成之后再次合入到主分支即可"抵消"掉你原本merge的代碼


2. 解決revert帶來的代碼消失問題

??回退到原來版本后囱桨,如何將A的代碼中再次合入master呢?
??中心思想就是保留A代碼且需要一個新的分支仓犬。
??比較方便的做法是:在新的master開一個新branch,在新branch中再將revert掉你revert掉的代碼(有點像負負得正的意思)

git checkout -b new_branch
git revert commitR // git revert是會觸發(fā)生成一個commit的
// 此處bugfix

git revert:

  • 優(yōu)點:能夠快速回滾代碼舍肠,并且可以保留revert記錄搀继,建議master分支回退代碼使用git revert
  • 缺點:需要重新生成個新的分支并生成新的commit才能夠再次合入到master


3. 解決非master的回退

??我們可以使用git reset --soft來回退到指定的版本,并進行bugfix翠语,再推到遠程倉庫來修改提交歷史叽躯,但由于本地倉庫的HEAD與遠程倉庫的HEAD歷史產生了分叉,因此推到遠程分支的時候會報錯:

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

??為了解決歷史分叉問題肌括,并且保留現有新的提交点骑,我們可以強行將本地commit推到遠程倉庫,如:

git push origin --force branch
git push origin -f branch // -f是--force的縮寫

PS: !!! 使用 -f 的時候需要特別小心谍夭,因為你一旦將現有的提交強推上去了黑滴,可能會導致原有的有效代碼下掉,所以使用的時候切記當心慧库,必須清楚自己在干什么跷跪。
git reset:

  • 優(yōu)點:能夠在同一個分支里面進行處理,分支合并操作次數較少
  • 缺點:操作不會出現在歷史圖中齐板,開發(fā)分支回滾建議使用reset吵瞻。由于master是保護分支葛菇,不建議使用在master分支上

??具體使用哪個命令來處理建議結合具體場景分析,并沒有絕對的好壞橡羞。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末眯停,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子卿泽,更是在濱河造成了極大的恐慌莺债,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件签夭,死亡現場離奇詭異齐邦,居然都是意外死亡,警方通過查閱死者的電腦和手機第租,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門措拇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慎宾,你說我怎么就攤上這事丐吓。” “怎么了趟据?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵券犁,是天一觀的道長。 經常有香客問我汹碱,道長粘衬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任比被,我火速辦了婚禮色难,結果婚禮上泼舱,老公的妹妹穿的比我還像新娘等缀。我一直安慰自己,他們只是感情好娇昙,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布尺迂。 她就那樣靜靜地躺著,像睡著了一般冒掌。 火紅的嫁衣襯著肌膚如雪噪裕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天股毫,我揣著相機與錄音膳音,去河邊找鬼。 笑死铃诬,一個胖子當著我的面吹牛祭陷,可吹牛的內容都是我干的苍凛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼兵志,長吁一口氣:“原來是場噩夢啊……” “哼醇蝴!你這毒婦竟也來了?” 一聲冷哼從身側響起想罕,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤悠栓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后按价,有當地人在樹林里發(fā)現了一具尸體惭适,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年楼镐,在試婚紗的時候發(fā)現自己被綠了腥沽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸠蚪,死狀恐怖今阳,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情茅信,我是刑警寧澤盾舌,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站蘸鲸,受9級特大地震影響妖谴,放射性物質發(fā)生泄漏。R本人自食惡果不足惜酌摇,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一膝舅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窑多,春花似錦仍稀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至千康,卻和暖如春享幽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拾弃。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工值桩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豪椿。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓奔坟,卻偏偏與公主長得像斯入,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛀蜜,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容