本文作者:@Ryan Miao
本文鏈接:https://www.cnblogs.com/woshimrf/p/5702696.html
版權(quán)聲明:?本博客所有文章除特別聲明外,均采用?CC BY-NC-SA 3.0?許可協(xié)議。轉(zhuǎn)載請(qǐng)注明出處缘屹!
目錄
具體做法:
上周提交了更改,過(guò)了周末回來(lái)說(shuō)要撤銷上個(gè)story晴氨。于是,需要找到上周提交的版本,rollback回來(lái)。
git版本管理命令取逾,自從習(xí)慣使用管理工具之后就很少接觸了,當(dāng)突然尋找其他指令的時(shí)候就成漿糊了薇溃,ctrl+k只能順利的提交而無(wú)關(guān)管理菌赖。因此,工具簡(jiǎn)化操作卻弱化了技能沐序。就像前幾天聽到的BBC 6分鐘英語(yǔ)的一段對(duì)話琉用。
Rob說(shuō)他當(dāng)年在酒吧實(shí)習(xí),對(duì)錢的加減算法很熟悉很強(qiáng)策幼,因?yàn)槟菚r(shí)候計(jì)算機(jī)還沒(méi)有推廣邑时。
計(jì)算器的出現(xiàn)使人們放棄了自己計(jì)算的本領(lǐng)。有時(shí)候即便僅僅是簡(jiǎn)單的加減法也不愿用自己的腦袋計(jì)算了特姐。不說(shuō)好壞晶丘,自己的感覺(jué)非常糟糕,因?yàn)橛X(jué)得自己曾經(jīng)擁有的技能消退了而難過(guò)唐含。所以說(shuō)浅浮,加強(qiáng)自身而不完全依賴于外物還是很重要的。
# Attention
更多Git以及Github的用法捷枯,參閱[Github工作流的正確打開方式](http://www.cnblogs.com/woshimrf/p/git-workflow.html)
# 結(jié)論放開頭
- 不要在公共分支做reset, 不要修改公共分支的歷史?
- 使用revert不會(huì)改變歷史滚秩,只是增加一個(gè)版本
1.reset
幾個(gè)月前,我提交了一次更改淮捆,這個(gè)更改涉及幾十個(gè)文件郁油,提交到github,Jenkins build攀痊,然后health check 503 error桐腌。看著報(bào)錯(cuò)我毫無(wú)頭緒苟径,不明白health check究竟是因?yàn)榇a的哪部分造成的案站,這提醒我以后的錯(cuò)誤日志一定要詳細(xì)。但有一點(diǎn)是肯定的棘街,這次提交的更改有問(wèn)題蟆盐。既然上一次的代碼沒(méi)問(wèn)題,那就回退吧蹬碧。
我在本地舱禽,使用git reset current branch to here. 這是Intelij自帶的git管理工具,可以指定版本后恩沽,然后回退到指定版本誊稚。本質(zhì)上就是 git ?reset 版本號(hào)。
顯然罗心,這個(gè)指令就是將head指針后退了一下里伯,也就是說(shuō),當(dāng)前版本是落后的渤闷。而我從master的最新一次提交reset到倒數(shù)第二個(gè)疾瓮,那么我的當(dāng)前的版本比maser落后一次提交。
既然回退好了飒箭,需要merge到master上面狼电。對(duì)應(yīng)到github上就是pull request.然而蜒灰,當(dāng)我選擇pull request的時(shí)候顯示nothing.說(shuō)本次更改不用merge。也就是說(shuō)master的歷史中已經(jīng)包含了這個(gè)版本肩碟,所以不用merge强窖。
因此,如果想要合并分支削祈,那么要合并的分支必須比當(dāng)前分支的版本先進(jìn)翅溺。顯然,reset只能重置本地或者說(shuō)本分支的更改髓抑。那么咙崎,我如果想要mater回退,我必須提交一個(gè)比mater先進(jìn)而且內(nèi)容正好的是上一次提交的相反的修改吨拍。這就是revert干的事情褪猛。
2.revert
revert指定版本可以實(shí)現(xiàn)版本回退。這個(gè)不是像reset一樣指針回退密末,而是會(huì)創(chuàng)建一個(gè)新的提交握爷,而且將指定版本的修改逆過(guò)來(lái)。這樣严里,我們想回退的內(nèi)容被逆反修改過(guò)來(lái)了新啼,而且我們的版本比master先進(jìn)。這樣就可以直接提交了刹碾。
具體做法:
假設(shè)當(dāng)前git log為:
G1 - G2 - G3 - B1 - B2 - B3
?G1-G3 正確的燥撞,好的,但 ?B1-B3 需要丟棄迷帜。
如果這些log都是在本地分支物舒,那么可以使用reset:
$ git reset --hard HEAD~3
注釋:
B3?asHEAD,?B2?isHEAD~1,?B1?isHEAD~2. 好的 G3?isHEAD~3:
G1 - G2 - G3 - B1 - B2 - B3\\\\-- HEAD\\\------ HEAD~1\\---------- HEAD~2\-------------- HEAD~3
但是如果這些log提交已經(jīng)在遠(yuǎn)程分支了,那就只能使用revert:
$ git revert --no-commit HEAD~2^..HEAD
Or:
$ git revert --no-commit HEAD~3..HEAD
注釋:
--no-commit是說(shuō)雖然HEAD~2到HEAD的提交已經(jīng)被回滾了戏锹,但回滾的內(nèi)容會(huì)放在緩存區(qū)冠胯,需要stage后commit才能生效。
這里锦针,"start..end"的意思是不包含start荠察,包含end。
注意:
1. Merge操作不能revert
2. 對(duì)于使用IDEA做開發(fā)的奈搜,推薦使用IDEA自帶的回退悉盆。查看log,然后點(diǎn)擊需要回退的文件馋吗,右鍵revert焕盟。
3. 回退要慎重,很容產(chǎn)生沖突宏粤。
參考
git代碼回滾:Reset脚翘、Checkout灼卢、Revert的選擇
Git - how to revert multiple recent commits
唯有不斷學(xué)習(xí)方能改變! --?Ryan Miao