基礎(chǔ)命令教程:廖雪峰的Git教程
本文就講述如何通過標(biāo)簽來修復(fù)緊急bug。參考 [Git高級教程 (一)] 通過Tag標(biāo)簽回退版本修復(fù)bug
步驟如下:
1.主分支回退到打標(biāo)簽的那次提交
2.拉取分支bugfix
3.主分支立即回到最新狀態(tài)
4.切換到bugfix分支晶渠,修改bug傲醉,發(fā)版本黄绩,打新標(biāo)簽
5.合并bugfix分支到主干上
6.手動(dòng)推送標(biāo)簽到遠(yuǎn)程
Git與SVN區(qū)別
Git和SVN正好相反笼恰,git提倡開發(fā)時(shí)拉分支辽话,各干各的,相互獨(dú)立帆喇,發(fā)版本時(shí)打標(biāo)簽警医;而svn呢,平時(shí)大家都在主干上干活坯钦,發(fā)版本時(shí)拉個(gè)分支法严,所以呢,svn經(jīng)常會(huì)提交沖突葫笼,經(jīng)常要合并代碼深啤,只能先把自己的代碼備份,然后下載別人的路星,再合并溯街。Git只需要合并一次就行了。
為啥會(huì)這樣呢洋丐?因?yàn)镾VN拉分支真的就是在磁盤上復(fù)制一份代碼呈昔,速度自然是很慢的啦,所以大家都不喜歡拉分支友绝,只有發(fā)版本時(shí)拉一下堤尾。而git呢,拉一個(gè)分支其實(shí)只不過是增加了一根指針而已迁客,所以很快郭宝,發(fā)版本時(shí)打個(gè)標(biāo)簽辞槐,其實(shí)只是取個(gè)別名而已,同樣很快粘室。
序
先提一個(gè)問題榄檬,如果線上版本遇到bug,老板要求緊急修復(fù)這個(gè)bug衔统,然后馬上發(fā)版本鹿榜,可是這個(gè)時(shí)候我們的代碼新功能已經(jīng)開發(fā)了到一半了,不能回退锦爵,怎么辦呢舱殿?
用過SVN的童鞋都知道,當(dāng)一個(gè)版本發(fā)布后险掀,就要拉一個(gè)分支做備份怀薛,這樣以后線上版本出現(xiàn)緊急bug就可以直接在分支上修復(fù)后,發(fā)版本迷郑,然后合并分支到主干上枝恋。
現(xiàn)在我們使用Git進(jìn)行版本管理的時(shí)候,則只需要打一個(gè)標(biāo)簽就行啦嗡害。
模擬
此時(shí)master是線上分支焚碌,提交記錄:
v1.0版本發(fā)布 (打過tag,發(fā)版)-新功能的N次提交
新功能的N次提交霸妹,所以直接回退十电,不妥當(dāng)。
先科普下幾個(gè)命令:
【發(fā)版后打tag】
$ git tag 版本名
【查看標(biāo)簽的詳情叹螟,找出打標(biāo)簽的那次提交的commit id】
$ git tag
$ git show v1.0
然后版本回退到此次提交版本
git reset --hard 7441b8
切記就直接在這改了鹃骂。
特別注意:通過標(biāo)簽回退版本后,要馬上拉一個(gè)分支罢绽,然后當(dāng)前主干分支要立即回到原來的位置畏线,否則正在開發(fā)的代碼可能白干了,然后在這個(gè)新拉分支上修復(fù)bug良价,然后合并到主分支寝殴,
【基于master拉取新分支】
git checkout -b bugfix
【從bugfix回到master調(diào)整HEAD至最新】
$ git checkout master
$ git reflog // 拿到最后一次提交的commitID
$ git reset --hard 最后一次提交的commitID
【切換到bugfix分支>修改bug>提交>合并到master>推送tag到遠(yuǎn)程】
$ git add .
$ git commit -m "修復(fù)第一次發(fā)版本的緊急bug"
$ git tag v2.0 //修改完畢,再打個(gè)標(biāo)簽明垢,一般標(biāo)簽的版本要升一級,這樣下次再出bug了蚣常,就直接從這兒改起
$ git checkout master //先切換到主干上
$ git merge bugfix //再合并修改bug的分支,此時(shí)沖突必然。
$ git status //這個(gè)時(shí)候可以用git status 命令查看誰發(fā)生了沖突
`
第一次發(fā)版本
<<<<<<< HEAD
第二次發(fā)版本
第三次發(fā)版本
=======
修復(fù)第一次發(fā)版本的緊急bug
>>>>>>> bugfix
`
其中<<<<<<Head到======這個(gè)是當(dāng)前分支痊银,也就是master分支的內(nèi)容抵蚊,從======到>>>>>>>bugfix,是bugfix分支的內(nèi)容
修改沖突很簡單啦,把多余的內(nèi)容去掉就可以了,然后提交代碼就解決沖突了
$ git push origin --tags //git push命令是不會(huì)推送標(biāo)簽的贞绳,這點(diǎn)一定要注意
好了谷醉,到這里我們就完成了通過標(biāo)簽修復(fù)線上版本的緊急bug,這個(gè)時(shí)候你就可以刪掉本地分支bugfix了熔酷,但是不建議你這么做,搞不好線上又出個(gè)bug豺裆,你就可以直接接著改啦拒秘,反正是在本地的分支。