1. 程式人生 > >通過Tag標籤回退版本修復bug

通過Tag標籤回退版本修復bug

本系列之所以取名”Git高階教程”,主要是教大家解決實際工作中遇到的問題,要求讀者會基本的Git用法和命令,請不要使用SourceTree這樣的工具,因為它讓你啥都不會、啥也不懂,git本身與Linux一脈相承,都是Linus torvalds寫的嘛,所以命令列才是精髓。如果你還不會Git的話,強烈建議你學習廖雪峰的教程,簡單易懂:

博主也是從這兒入門的,既然有這麼好的教程,為什麼還要寫這個系列的部落格呢?很簡單嘛,這個教程只是入門教程,解決實際工作中遇到的問題還是不夠的,所以博主專門寫Git高階教程,記錄如何解決實際工作中的問題。

2 簡介

先提一個問題,如果線上版本遇到bug,老闆要求緊急修復這個bug,然後馬上發版本,可是這個時候我們的程式碼新功能已經開發了到一半了,不能回退,怎麼辦呢?

用過SVN的童鞋都知道,當一個版本釋出後,就要拉一個分支做備份,這樣以後線上版本出現緊急bug就可以直接在分支上修復後,發版本,然後合併分支到主幹上。

現在我們使用Git進行版本管理的時候,則只需要打一個標籤就行啦。

3 Git與SVN區別

Git和SVN正好相反,git提倡開發時拉分支,各幹各的,相互獨立,發版本時打標籤;而svn呢,平時大家都在主幹上幹活,發版本時拉個分支,所以呢,svn經常會提交衝突,經常要合併程式碼,只能先把自己的程式碼備份,然後下載別人的,再合併。Git只需要合併一次就行了。

為啥會這樣呢?因為SVN拉分支真的就是在磁碟上覆制一份程式碼,速度自然是很慢的啦,所以大家都不喜歡拉分支,只有發版本時拉一下。而git呢,拉一個分支其實只不過是增加了一根指標而已,所以很快,發版本時打個標籤,其實只是取個別名而已,同樣很快。

本文就講述如何通過標籤來修復緊急bug。

4 環境搭建

我們先來模擬開發中遇到的情況,博主演示用的目錄是 e:\learngit 
(1) 首先在e盤下建一個資料夾learngit, 然後開啟GitBash,進入e:\learngit目錄,並初始化:

cd "e:\learngit"
git init
  • 1
  • 2
  • 1
  • 2

使用下面的命令,來設定你的使用者名稱和郵箱,這裡的使用者名稱和郵箱一般是你的github賬號:

git config user.name "xxxx"
git config user.email "[email protected]"
  • 1
  • 2
  • 1
  • 2

(2) 在leangit下新建一個檔案a.txt,然後寫

第一次發版本
  • 1
  • 1

用下面的命令來提交:

git add a.txt
git commit -m "第一次發版本"
  • 1
  • 2
  • 1
  • 2

提交完畢,可以使用下面的命令來檢視提交的記錄:

git log
  • 1
  • 1

這裡寫圖片描述

(2) 打標籤,釋出版本之後就要打標籤了,命令如下:

git tag -a v1.0 -m "v1.0版本釋出"
  • 1
  • 1

然後檢視所有標籤用下面命令:

git tag 
  • 1
  • 1

這裡寫圖片描述

你也可以檢視某個標籤的詳情:

git show v1.0
  • 1
  • 1

這裡寫圖片描述

上面是打標籤的時候寫的備註,下面是標籤記錄的那次提交的備註,其實標籤只是對某一次提交記錄起了一個別名而已,不要以為通過標籤一下次就能拉取程式碼。

(3) 在a.txt中增加一行”第二次釋出版本”,然後用

git add a.txt
git commit -m "第二次釋出版本" 
  • 1
  • 2
  • 1
  • 2

命令提交,但是不需要打標籤。

(4) 在a.txt中再增加一行”第三次釋出版本”,然後用

git add a.txt
git commit -m "第三次釋出版本" 
  • 1
  • 2
  • 1
  • 2

命令提交,也不需要打標籤,這樣我們就模擬了在第一次釋出版本,打完標籤後,我們向前繼續開發的過程,a.txt內容如下:

第一次發版本
第二次發版本
第三次發版本
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

用 git log命令檢視,如下圖:

這裡寫圖片描述

(5) 到此我們就模擬完成了,這個時候第一次發的版本有個bug,要緊急修復,下面我們來完成這個需求

5 通過標籤恢復程式碼

(1) 檢視標籤的詳情,找出打標籤的那次提交的commit id

git tag
git show v1.0
  • 1
  • 2
  • 1
  • 2

這裡寫圖片描述

commit id這麼長記不住怎麼辦呢?別擔心,我們只需要記住前面幾位就可以了,這裡我們只取前6位:7441b8。Git會根據前面幾位自動識別的,當然,你的commit id跟我的肯定是不一樣的。

(2) 版本回退 
下面我們就通過commit id回到發版本時候的程式碼去嘍:

git reset --hard 7441b8
  • 1
  • 1

注意把7441b8換成你的commid id。回退完畢,再看a.txt:

第一次發版本
  • 1
  • 1

如果有亂碼的話,改成以UTF-8無BOM格式編碼。看到沒,我們又回到了第一次發版本時候的程式碼,是不是有點小激動啊.

如果這個時候你立馬投入與bug的戰鬥,修改後發版本,那麼你就犯了嚴重的錯誤,因為你修改後的程式碼是無法與正在開發的版本合併噠,也就是說你的修改並不能加入現有的程式碼。所以:

特別注意:通過標籤回退版本後,要馬上拉一個分支,然後當前主幹分支要立即回到原來的位置,否則正在開發的程式碼可能白乾了,接著在剛拉的分支上修改bug,修改完畢合併到主幹上

(3) 拉取分支

回退版本後,立即拉取分支,這裡取名bugfix分支:

git checkout -b bugfix
  • 1
  • 1

如圖所示,我們已經在bugfix分支上了:

這裡寫圖片描述

檢視所有分支請用命令:

git branch
  • 1
  • 1

(4) 主幹分支立即回到原來的位置

首先,請先回到主幹分支上:

git checkout master
  • 1
  • 1

這裡寫圖片描述

回退版本需要commit id,向前進呢,同樣也是的。還記得我在第三次提交完畢後,用git log命令檢視提交記錄嗎,現在我們需要第三次提交的commit id,再用git log命令:

這裡寫圖片描述

可以看到只有第一次的提交記錄了,因為這個時候版本回退了git log是查不到第三次提交記錄的,怎麼辦呢,怎麼才能回去呢? 
別急,這個時候,我們用下面這個命令:

git reflog
  • 1
  • 1

這裡寫圖片描述

看到了嗎,你所有的操作記錄都在這兒,這就是git,記錄操作。可以看到第三次的commit id是 7358a51。回去嘍:

git reset --hard 7358a51
  • 1
  • 1

再看a.txt:

第一次發版本
第二次發版本
第三次發版本
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

回到最新的版本啦

(5) 切換到bugfix分支,修改bug

git checkout bugfix
  • 1
  • 1

這時a.txt只有一行文字,因為我們的bugfix分支是回退版本到第一次提交時拉取的分支,接著我們加一行”修復第一次發版本的緊急bug”:

第一次發版本
修復第一次發版本的緊急bug
  • 1
  • 2
  • 1
  • 2

接著用命令

git add a.txt
git commit -m "修復第一次發版本的緊急bug"
git tag v2.0 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

提交這次修改,修改完畢,再打個標籤,一般標籤的版本要升一級,這樣下次再出bug了,就直接從這兒改起,也就可以在合併後直接刪除bugfix分支了

(6) 合併到主幹上

在bugfix分支上修復了緊急bug之後,就可以發一個新的版本,之後就要把修復後的程式碼合併到我們的主幹上,不然下次發版本這個bug還是存在的。合併用下面的命令:

git checkout master //先切換到主幹上
git merge bugfix    //再合併修改bug的分支
  • 1
  • 2
  • 1
  • 2

這個時候,你可以在心裡默唸,神獸保佑,沒有衝突。然而這並沒有什麼卵用,你念或不念,衝突就在那裡,不多不少。這個時候可以用git status 命令檢視誰發生了衝突:

這裡寫圖片描述

從上圖可以看到兩個分支都修改了a.txt,這個時候再來看a.txt:

第一次發版本
<<<<<<< HEAD
第二次發版本
第三次發版本
=======
修復第一次發版本的緊急bug
>>>>>>> bugfix
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其中<<<<<<Head======這個是當前分支,也就是master分支的內容,從======>>>>>>>bugfix,是bugfix分支的內容 
修改衝突很簡單啦,把多餘的內容去掉就可以了

第一次發版本
修復第一次發版本的緊急bug
第二次發版本
第三次發版本
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

提交程式碼就解決衝突了

(7) 推送標籤到遠端

在實際開發中我們都是關聯了遠端倉庫的,在提交完程式碼後我們一般用git push將程式碼推送到遠端倉庫中,但是git push命令是不會推送標籤的,這點一定要注意

標籤必須手動推送到遠端倉庫

可以用下面的命令一次推送所有標籤到遠端:

git push origin --tags 
  • 1
  • 1

(8) 好了,到這裡我們就完成了通過標籤修復線上版本的緊急bug,這個時候你就可以刪掉本地分支bugfix了,但是不建議你這麼做,搞不好線上又出個bug,你就可以直接接著改啦,反正是在本地的分支。

6 總結

總結一下,通過標籤修改bug的步驟如下:

  1. 主分支回退到打標籤的那次提交
  2. 拉取分支bugfix
  3. 主分支立即回到最新狀態
  4. 切換到bugfix分支,修改bug,發版本,打新標籤
  5. 合併bugfix分支到主幹上
  6. 手動推送標籤到遠