【git】遠(yuǎn)程倉庫版本回退方法

1 簡介

最近在使用git時遇到了遠(yuǎn)程分支需要版本回滾的情況逃糟,于是做了一下研究,寫下這篇博客壳贪。

2 問題

如果提交了一個錯誤的版本抵拘,怎么回退版本哎榴?

如果提交了一個錯誤的版本到遠(yuǎn)程分支,怎么回退遠(yuǎn)程分支版本僵蛛?

如果提交了一個錯誤的版本到公共遠(yuǎn)程分支尚蝌,又該怎么回退版本?

3 本地分支版本回退的方法

如果你在本地做了錯誤提交墩瞳,那么回退版本的方法很簡單

先用下面命令找到要回退的版本的commit id:

git reflog

接著回退版本:

git reset--hard Obfafd

0bfafd就是你要回退的版本的commit id的前面幾位

4 自己的遠(yuǎn)程分支版本回退的方法

如果你的錯誤提交已經(jīng)推送到自己的遠(yuǎn)程分支了驼壶,那么就需要回滾遠(yuǎn)程分支了。

首先要回退本地分支:

git reflog

git reset--hard Obfafd

緊接著強制推送到遠(yuǎn)程分支:

git push -f

注意:本地分支回滾后喉酌,版本將落后遠(yuǎn)程分支热凹,必須使用強制推送覆蓋遠(yuǎn)程分支,否則無法推送到遠(yuǎn)程分支

5 公共遠(yuǎn)程分支版本回退的問題

看到這里泪电,相信你已經(jīng)能夠回滾遠(yuǎn)程分支的版本了般妙,那么你也許會問了,回滾公共遠(yuǎn)程分支和回滾自己的遠(yuǎn)程分支有區(qū)別嗎相速?

答案是碟渺,當(dāng)然有區(qū)別啦。

一個顯而易見的問題:如果你回退公共遠(yuǎn)程分支突诬,把別人的提交給丟掉了怎么辦苫拍?

下面來分析:

假如你的遠(yuǎn)程master分支情況是這樣的:

A1–A2–B1

其中A芜繁、B分別代表兩個人,A1绒极、A2骏令、B1代表各自的提交。并且所有人的本地分支都已經(jīng)更新到最新版本垄提,和遠(yuǎn)程分支一致榔袋。

這個時候你發(fā)現(xiàn)A2這次提交有錯誤,你用reset回滾遠(yuǎn)程分支master到A1铡俐,那么理想狀態(tài)是你的隊友一拉代碼git pull凰兑,他們的master分支也回滾了,然而現(xiàn)實卻是审丘,你的隊友會看到下面的提示:

$ git status

On branch master

Your branch is ahead of 'origin/master' by 2 commits.(use"git push"to publish your local commits)nothing to commit, working directory clean

也就是說吏够,你的隊友的分支并沒有主動回退,而是比遠(yuǎn)程分支超前了兩次提交备恤,因為遠(yuǎn)程分支回退了嘛稿饰。

(1) 這個時候,你大吼一聲:兄弟們露泊,老子回退版本了。如果你的隊友都是神之隊友旅择,比如: Tony(騰訊CTO)惭笑,那么Tony會冷靜的使用下面的命令來找出你回退版本后覆蓋掉的他的提交,也就是B1那次提交:

git reflog

然后冷靜的把自己的分支回退到那次提交生真,并且拉個分支:

git checkout tony_branch//先回到自己的分支?

?git reflog//接著看看當(dāng)前的commit id,例如:0bbbbb? ??

git reset--hard B1//回到被覆蓋的那次提交B1

git checkout-b tony_backup//拉個分支沉噩,用于保存之前因為回退版本被覆蓋掉的提交B1

git checkout tony_branch//拉完分支,迅速回到自己分支

git reset--hard 0bbbbbb//馬上回到自己分支的最前端

通過上面一通敲柱蟀,Tony暫時舒了一口氣川蒙,還好,B1那次提交找回來了,這時tony_backup分支最新的一次提交就是B1长已,接著Tony要把自己的本地master分支和遠(yuǎn)程master分支保持一致:

git reset--hard origin/master


執(zhí)行了上面這條命令后畜眨,Tony的master分支才真正的回滾了,也就是說你的回滾操作才能對Tony生效,這個時候Tony的本地maser是這樣的:

A1

接著Tony要再次合并那個被丟掉的B1提交:

git checkout master//切換到master

git merge tony_backup//再合并一次帶有B1的分支到master

好了术瓮,Tony終于長舒一口氣康聂,這個時候他的master分支是下面這樣的:

A1 – B1

終于把丟掉的B1給找回來了,接著他push一下胞四,你一拉也能同步恬汁。

同理對于所有隊友也要這樣做,但是如果該隊友沒有提交被你丟掉辜伟,那么他拉完代碼git pull之后氓侧,只需要強制用遠(yuǎn)程master覆蓋掉本地master就可以了

git reset--hard origin/master

(2) 然而很不幸的是脊另,現(xiàn)實中,我們經(jīng)常遇到的都是豬一樣的隊友约巷,他們一看到下面提示:

$ git status

On branch master

Your branch is ahead of 'origin/master' by 2 commits.(use"git push"to publish your local commits)nothing to commit, working directory clean

就習(xí)慣性的git push一下尝蠕,或者他們直接用的SourceTree這樣的圖形界面工具,一看到界面上顯示的是推送的提示就直接點了推送按鈕载庭,臥&槽看彼,你辛辛苦苦回滾的版本就這樣輕松的被你豬一樣的隊友給還原了,所以囚聚,只要有一個隊友push之后靖榕,遠(yuǎn)程master又變成了:

A1 – A2 – B1

這就是分布式,每個人都有副本顽铸。這個時候你連揍他的心都有了茁计,怎么辦呢?你不能指望每個人隊友都是git高手谓松,下面我們用另外一種方法來回退版本星压。

注意:博主是在虛擬機中實驗的,用于模擬兩個人的操作鬼譬,如果你在一個機器上娜膘,用同一個賬號在不同的目錄下克隆兩份代碼來實驗的話,回退遠(yuǎn)程分支后优质,另外一個人是不會看到落后遠(yuǎn)程分支兩次提交的竣贪,所以請務(wù)必使用虛擬機來模擬A、B兩個人的操作

6 公共遠(yuǎn)程分支版本回退的方法

使用git reset回退公共遠(yuǎn)程分支的版本后巩螃,需要其他所有人手動用遠(yuǎn)程master分支覆蓋本地master分支演怎,顯然,這不是優(yōu)雅的回退方法避乏,下面我們使用另個一個命令來回退版本:

git revert HEAD//撤銷最近一次提交

git revert HEAD~1//撤銷上上次的提交爷耀,注意:數(shù)字從0開始

git revert 0ffaacc//撤銷0ffaacc這次提交

git revert 命令意思是撤銷某次提交。它會產(chǎn)生一個新的提交拍皮,雖然代碼回退了歹叮,但是版本依然是向前的,所以春缕,當(dāng)你用revert回退之后盗胀,所有人pull之后,他們的代碼也自動的回退了锄贼。

但是票灰,要注意以下幾點:

revert 是撤銷一次提交,所以后面的commit id是你需要回滾到的版本的前一次提交

使用revert HEAD是撤銷最近的一次提交,如果你最近一次提交是用revert命令產(chǎn)生的屑迂,那么你再執(zhí)行一次浸策,就相當(dāng)于撤銷了上次的撤銷操作,換句話說惹盼,你連續(xù)執(zhí)行兩次revert HEAD命令庸汗,就跟沒執(zhí)行是一樣的

使用revert HEAD~1 表示撤銷最近2次提交,這個數(shù)字是從0開始的手报,如果你之前撤銷過產(chǎn)生了commi id蚯舱,那么也會計算在內(nèi)的。

如果使用 revert 撤銷的不是最近一次提交掩蛤,那么一定會有代碼沖突枉昏,需要你合并代碼,合并代碼只需要把當(dāng)前的代碼全部去掉揍鸟,保留之前版本的代碼就可以了.

git revert 命令的好處就是不會丟掉別人的提交兄裂,即使你撤銷后覆蓋了別人的提交,他更新代碼后阳藻,可以在本地用 reset 向前回滾晰奖,找到自己的代碼,然后拉一下分支腥泥,再回來合并上去就可以找回被你覆蓋的提交了匾南。

7 revert 合并代碼,解決沖突

使用revert命令道川,如果不是撤銷的最近一次提交午衰,那么一定會有沖突,如下所示:

<<<<<<?HEAD

全部清空

第一次提交

=======

全部清空

>>>>>>> parent of c24cde7... 全部清空


解決沖突很簡單冒萄,因為我們只想回到某次提交,因此需要把當(dāng)前最新的代碼去掉即可橙数,也就是HEAD標(biāo)記的代碼:

<<<<<<< HEAD

全部清空

第一次提交

=======

把上面部分代碼去掉就可以了尊流,然后再提交一次代碼就可以解決沖突了。

8 繼續(xù)擴展灯帮,簡單粗暴的回滾方法

看到這里也許你已經(jīng)覺得學(xué)會了遠(yuǎn)程倉庫版本回滾方法了崖技,但是實踐中總是會遇到很多不按套路來的問題,考慮下面一種情況:

如果你們開發(fā)中钟哥,忽然發(fā)現(xiàn)前面很遠(yuǎn)的地方有一次錯誤的合并代碼迎献,把本來下一次才能發(fā)的功能的代碼合并到了這一次來了,這個時候全體成員都覺得直接回滾比較快腻贰,因為他們都有備份吁恍,覆蓋了無所謂,這個時候用reset的話對隊友的要求比較高,用revert的話呢要大面積的解決沖突冀瓦,也很麻煩呀伴奥,怎么辦呢?

這個時候翼闽,可以使用簡單粗暴的辦法拾徙,直接從那個錯誤的提交的前一次拉取一份代碼放到其他目錄,然后將master代碼全部刪除感局,把那份新代碼方進去尼啡,然后提交,果然簡單粗暴啊询微,雖然這種方法不入流崖瞭,但是,實踐中發(fā)現(xiàn)很好使啊拓提,所以读恃,實踐是檢驗真理的唯一標(biāo)準(zhǔn)。遇到問題還是要靈活應(yīng)對代态。


9 總結(jié)

遠(yuǎn)程分支回滾的三種方法:

自己的分支回滾直接用reset

公共分支回滾用revert

錯的太遠(yuǎn)了直接將代碼全部刪掉寺惫,用正確代碼替代


原文地址:https://www.cnblogs.com/qlqwjy/p/8179684.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹦疑,隨后出現(xiàn)的幾起案子西雀,更是在濱河造成了極大的恐慌,老刑警劉巖歉摧,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艇肴,死亡現(xiàn)場離奇詭異,居然都是意外死亡叁温,警方通過查閱死者的電腦和手機再悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膝但,“玉大人冲九,你說我怎么就攤上這事「” “怎么了莺奸?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冀宴。 經(jīng)常有香客問我灭贷,道長,這世上最難降的妖魔是什么略贮? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任甚疟,我火速辦了婚禮仗岖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘古拴。我一直安慰自己箩帚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布黄痪。 她就那樣靜靜地躺著紧帕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桅打。 梳的紋絲不亂的頭發(fā)上是嗜,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音挺尾,去河邊找鬼鹅搪。 笑死,一個胖子當(dāng)著我的面吹牛遭铺,可吹牛的內(nèi)容都是我干的丽柿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼魂挂,長吁一口氣:“原來是場噩夢啊……” “哼甫题!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涂召,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坠非,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后果正,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炎码,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年秋泳,在試婚紗的時候發(fā)現(xiàn)自己被綠了潦闲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡迫皱,死狀恐怖矫钓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舍杜,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布赵辕,位于F島的核電站既绩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏还惠。R本人自食惡果不足惜饲握,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧救欧,春花似錦衰粹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹬刷,卻和暖如春瓢捉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背办成。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工泡态, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迂卢。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓某弦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親而克。 傳聞我的和親對象是個殘疾皇子靶壮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 有兩種方法:git reset 和 git revert 一. 問題 如果提交了一個錯誤的版本,怎么回退版本拍摇?...
    McDu閱讀 7,618評論 0 1
  • 轉(zhuǎn)自:http://blog.csdn.net/fuchaosz/article/details/52170105...
    yunxiu閱讀 184評論 0 0
  • 以下筆記主要參考gitgot亮钦,大致了解git使用和原理。 第一部分我們從個人的視角去研究如何用好Git充活,并且揭示G...
    carolwhite閱讀 2,383評論 0 1
  • git 使用筆記 git原理: 文件(blob)對象蜂莉,樹(tree)對象,提交(commit)對象 tree對象 ...
    神刀閱讀 3,773評論 0 10
  • 這篇工具文章混卵,足以滿足開發(fā)使用了映穗。 -【http方式免密碼】 - 【設(shè)置提交的用戶信息】 -【基本git提交流程】...
    麥殼兒UIandFE2閱讀 1,366評論 0 2