[Git高級教程 (一)] 通過 Tag 標簽回退版本修復 bug

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

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

廖雪峰的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

使用下面的命令,來設置你的用戶名和郵箱,這里的用戶名和郵箱一般是你的github賬號:

git config user.name "xxxx"
git config user.email "xxx@xxx"

(2) 在leangit下新建一個文件a.txt,然后寫

第一次發版本

用下面的命令來提交:

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

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

git log

è?é?????è?°
(2) 打標簽,發布版本之后就要打標簽了,命令如下:

git tag -a v1.0 -m "v1.0版本發布"

然后查看所有標簽用下面命令:

git tag?

è?é?????è?°

你也可以查看某個標簽的詳情:

git show v1.0

è?é?????è?°

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

(3) 在a.txt中增加一行”第二次發布版本”,然后用

git add a.txt
git commit -m "第二次發布版本"?

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

(4) 在a.txt中再增加一行”第三次發布版本”,然后用

git add a.txt
git commit -m "第三次發布版本"?

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

第一次發版本
第二次發版本
第三次發版本

用 git log命令查看,如下圖:

è?é?????è?°

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

5 通過標簽恢復代碼
(1) 查看標簽的詳情,找出打標簽的那次提交的commit id

git tag
git show v1.0

è?é?????è?°

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

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

git reset --hard 7441b8

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

第一次發版本

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

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

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

(3) 拉取分支

回退版本后,立即拉取分支,這里取名bugfix分支:

git checkout -b bugfix

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

è?é?????è?°

查看所有分支請用命令:

git branch

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

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

git checkout master

è?é?????è?°

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

è?é?????è?°

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

git reflog

è?é?????è?°

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

git reset --hard 7358a51

再看a.txt:

第一次發版本
第二次發版本
第三次發版本

回到最新的版本啦

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

git checkout bugfix

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

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

接著用命令

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

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

(6) 合并到主干上

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

git checkout master //先切換到主干上
git merge bugfix ? ?//再合并修改bug的分支

這個時候,你可以在心里默念,神獸保佑,沒有沖突。然而這并沒有什么卵用,你念或不念,沖突就在那里,不多不少。這個時候可以用git status 命令查看誰發生了沖突:

è?é?????è?°

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

第一次發版本
<<<<<<< HEAD
第二次發版本
第三次發版本
=======
修復第一次發版本的緊急bug
>>>>>>> bugfix

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

第一次發版本
修復第一次發版本的緊急bug
第二次發版本
第三次發版本

提交代碼就解決沖突了

(7) 推送標簽到遠程

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

標簽必須手動推送到遠程倉庫

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

git push origin --tags?

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

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

主分支回退到打標簽的那次提交
拉取分支bugfix
主分支立即回到最新狀態
切換到bugfix分支,修改bug,發版本,打新標簽
合并bugfix分支到主干上
手動推送標簽到遠程


轉自 “梧桐那時雨”的博客:http://blog.csdn.net/fuchaosz/article/details/51698896
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javascript 自定義輸出

緣由 前段時間再看了一些javascript的學習資料,也寫的一些demo,在輸出的時候一般都用alert,但這個方法會打斷函數運行,用起來不是很好.還有就是console.log這個方法,這種方法原來一直以為只能在FireFox上面才能用,現在才發現主流瀏覽器都支持.但我的這個插件已經寫的差不多了,所…

不要打2歲內和6歲后的孩子 父母必看

一位媽媽說&#xff1a;“孩子經常無理取鬧&#xff0c;到超市就要買這買那&#xff0c;不給買就坐在地上哭鬧。到別人家去就亂翻亂動&#xff0c;還會到人家沙發上亂蹦&#xff0c;無論你怎么說&#xff0c;孩子都不聽話。每次我都會氣不打一處來&#xff0c;回到家就痛打一頓…

設計模式之開放封閉原則

以下皆是個人理解如有不對請留言指出&#xff0c;謝謝&#xff01; 我就代碼提出我自己個人的看法&#xff1a; 正常定義一個類例如銀行工作員&#xff0c;他可以執行存款&#xff0c;付款和轉賬功能&#xff0c;如果在現有功能上我想添加貸款功能&#xff0c;需要在類中添加…

[Git高級教程(二)] 遠程倉庫版本回退方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1 簡介 最近在使用git時遇到了遠程分支需要版本回滾的情況&#xff0c;于是做了一下研究&#xff0c;寫下這篇博客。 2 問題 如果提交了…

uplift model學習筆記

一、解決的問題&#xff1a; 通常的 Propensity Model 和 Response Model 只是給目標用戶打了個分&#xff0c;并沒有確保模型的結果可以使得活動的提升最大化&#xff1b;它沒有告訴市場營銷人員&#xff0c;哪個用戶最有可能提升活動響應&#xff1b; 因此&#xff0c;需要另…

必須看透的50個錯覺 人生要看透而不看破!

我們應該感謝命運的多喘&#xff0c;是它用歷練使一顆脆弱心的漸漸變得堅強&#xff0c;變得對一切都充滿了向往。無可否認&#xff0c;只有真正的經歷了一些事物之后&#xff0c;你才會對人生看得更加透徹&#xff0c;才會對世間真情感悟的更加真切。 1、個人只能被現實改變…

設計模式之依賴倒置原則

在傳統的過程式中&#xff0c;上層依賴于底層&#xff0c;當底層變化&#xff0c;上層也得跟著做出相應的變化。這就是面向過程的思想&#xff0c;弊端就是導致程序的復用性降低并且提高了開發的成本。 而面向對象的開發則很好的解決了這個問題&#xff0c;讓用戶程序依賴于抽象…

@Transactional 詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Transactional 是聲明式事務管理 編程中使用的注解 1 .添加位置 1&#xff09;接口實現類或接口實現方法上&#xff0c;而不是接口類中…

LiveGBS高性能GB28181國標流媒體服務流傳輸模式支持UDP、TCP被動、TCP主動模式

LiveGBS國標(GB28181)流媒體服務軟件&#xff1a; 提供用戶管理及Web可視化頁面管理&#xff1b; 提供設備狀態管理&#xff0c;可實時查看設備是否掉線等信息&#xff1b; 實時流媒體處理&#xff0c;PS&#xff08;TS&#xff09;轉ES&#xff1b; 設備狀態監測、云臺控制、錄…

通過人行橫道線

學車中的通過人行橫道線 人行橫道線&#xff0c;俗稱斑馬線&#xff0c;是由一條一條的白色線組成的&#xff0c;主要是用來讓行人穿越馬路的。 駕駛員駕駛車輛通過人行橫道時應該減速緩行&#xff0c;注意禮讓行人。 考核要求 當駕車進入路面有施劃人行橫道線的&#xf…

python學習-38迭代器和生成器

迭代器和生成器---- 迭代器協議和for循環工作機制1.迭代器協議&#xff1a;對象必須提供一個next方法&#xff0c;執行該方法要么返回迭代中的下一項&#xff0c;要么引起一個Stoplteration異常&#xff0c;以終止迭代&#xff08;只能往后走&#xff0c;不能往前走&#xff09…

[轉載]基于Aaf的數據拆分

(本文適于使用Aaf框架的開發者閱讀) 1. 基本原理 在Aaf框架中&#xff0c;“對象”和“存儲”的關系映射有一個關鍵的紐帶StorageAlias&#xff0c;即“存儲別名”&#xff0c;同樣一個類型&#xff0c;在不同的存儲別名下&#xff0c;可以自由映射到任意存儲“位置”。  “位…

靠邊停車

什么是靠邊停車 靠邊停車是大路考中一個指標很明確的考核項目&#xff0c;要求學員駕駛車輛使之靠邊停下。 操作方法 1、停車前&#xff0c;要通過內、外后視鏡觀察后方和右側交通情況&#xff0c;開右轉向燈。 2、適量踩下制動踏板。 3、向右轉動方向盤(第一把輪…

RuntimeException 和 Exception 區別、異常的子父級關系

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.java 將所有的錯誤封裝為一個對象&#xff0c;其根本父類為Throwable, Throwable 有兩個子類&#xff1a;Error 和 Exception。 2.Err…

通過路口

操作方法 1、讓車減速 2、觀察路口的情況 3、通過路口 注意事項 1、不要搶黃燈 2、不要開英雄車&#xff0c;即紅燈亮起時通過路口的最后一輛車 3、控制車速&#xff0c;控制在50km/h以下 4、看到左右車都減速時&#xff0c;也馬上減速 5、要左轉…

C語言筆記(關鍵字)

gdb調試 gcc 源程序 -g&#xff1b;加gdb調試信息gdb可執行程序&#xff1b;&#xff08;gdb調試&#xff09;l&#xff08;ist&#xff09;&#xff1a;查看源碼&#xff0c;按一下從main開始10行以此往后l n&#xff1a;查看n處上下10行的源碼run&#xff1a;運行程序b&…

自定義 Git - Git 鉤子 (自動部署)

Git 鉤子 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 和其它版本控制系統一樣&#xff0c;Git 能在特定的重要動作發生時觸發自定義腳本。 有兩組這樣的鉤子&#xff1a;客戶端的和…

變更車道

操作方法 1、觀察與判斷觀察車輛后方、側方和準備變更的車道上的交通流情況&#xff1b; 2、確認安全后&#xff0c;打開轉向指示燈示意&#xff0c;并再次通過后視鏡觀察兩側道路上有無車輛超越&#xff0c;確認準備駛入的車道是否允許留有安全距離&#xff1b; 3…

C語言筆記(符號)

注釋符號 幾個似非而是的注釋問題 例子&#xff1a; (A) int / * ... * /i; (B) char * s "abcdefgh //hijklmn"; (C) //Is it a \valid comment? (D) in/ * ... * /t i; 我們知道C語言里可以有兩種注釋方式&#xff1a;“/* */” 和 “ // ”。那么上面幾條…

直線行駛

考核要求 保證跟車安全速度和安全距離&#xff0c;了解車輛行駛速度、注意觀察路面狀況&#xff0c;采取相應措施。不能有左右擺動、方向不穩的現象。 考試口訣 一.尋找中心 二.雙眼鎖定本車能通行的中心 三.心理想著走中間 四.雙眼從本車前面最突出點的.中心…