git圖解(2):代碼回退

封面.jpg

關(guān)于 git 的基本理解剔氏, 在第一篇git文章已介紹搬男。 上一篇文章主要講解了git的提交操作锅锨, 本篇在上篇基礎(chǔ)上著重寫git代碼的逆向操作:代碼回退靠娱。網(wǎng)上關(guān)于git回退的文章比較多柬脸, 本文是個人理解實踐的匯總, 不當、不全之處請評論區(qū)指出宾巍。
首先,回顧下git代碼存在的5個區(qū)域渔伯, 分別是 工作區(qū)間顶霞、工作現(xiàn)場緩存區(qū)(或叫暫存區(qū))锣吼、本地倉庫(或叫當前分支)选浑、遠程倉庫(或叫遠程分支);如下圖:
1.png

1.緩存區(qū)代碼覆蓋工作區(qū)代碼

場景: 緩存區(qū)存有上次改動代碼玄叠,即之前有執(zhí)行:

git add
```
當前**工作區(qū)間**代碼想廢棄古徒, 可將**緩存區(qū)**中代碼覆蓋之:

![3.png](http://upload-images.jianshu.io/upload_images/615809-b6283ed165397d5f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**對應(yīng)指令:**
```
// 將緩存區(qū)某一文件代碼 覆蓋本地工作區(qū): 
git checkout -- testReset.txt

// 將匹配的文件覆蓋:
git checkout -- *.txt

// 將所有文件覆蓋:
git checkout -- .
```
# 2.本地倉庫代碼覆蓋緩存區(qū)代碼
場景:發(fā)現(xiàn)之前add的文件不需要了,又不想**工作區(qū)間**重新改回去读恃。
![4.jpeg](http://upload-images.jianshu.io/upload_images/615809-530852aee221207b.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**對應(yīng)指令:**
```
// 將本地倉庫某一文件覆蓋緩存區(qū): 
git reset HEAD testReset.txt 

// 將匹配的文件覆蓋緩存區(qū):
git reset HEAD *.txt

// 將所有文件覆蓋緩存區(qū):
git reset HEAD .
```
注意: 改變的是**緩存區(qū)**代碼隧膘, **工作區(qū)間**代碼不變(編輯器代碼不會改變)

# 3.本地倉庫代碼覆蓋工作區(qū)代碼(常用)
上述兩場景在實際開發(fā)中沒那么常用,接下來 **本地倉庫** 代碼 覆蓋 **工作區(qū)間 **代碼 則經(jīng)常會用到寺惫。
場景: 當前 **工作區(qū)間** 代碼混亂(一般更新或合并分支后) 疹吃, 廢棄當前改動;
![5.png](http://upload-images.jianshu.io/upload_images/615809-06b2d06489ebb0cb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**對應(yīng)指令:**
```
// 將本地倉庫某一文件代碼 覆蓋本地工作區(qū): 
git checkout head testReset.txt

// 將本地倉庫所有文件代碼 覆蓋本地工作區(qū):(謹慎操作):
git checkout head .
```
我們知道**本地倉庫**中有一個commit 列表西雀, 記錄了所有commit的記錄萨驶, 查看commit列表指令:
```
// 查看commit id, 查看提交記錄(git commit的記錄)
git log 
git log --pretty=oneline 

// 查看以往提交歷史(包括 撤銷回退 記錄) 
git reflog 
```
![6.png](http://upload-images.jianshu.io/upload_images/615809-5536c973563a7f39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
根據(jù)commit列表艇肴, **工作區(qū)間**代碼能實現(xiàn)更靈活的回退:
```
// 本地工作區(qū)間代碼 回退到上一次版本腔呜、上上次、前10個版本 
git reset --hard HEAD^ 
git reset --hard HEAD^^ 
git reset --hard HEAD~10 

// 本地工作區(qū)間代碼 回退到指定版本(“d362816”為commit id) 
git reset --hard d362816 
```
# 4.遠程倉庫代碼覆蓋本地倉庫代碼(清除 未push 的commit)
場景: 有時候合并分支再悼、切換分支育谬、更新代碼會導(dǎo)致提交絮亂的問題(沒使用--rebase方式),具體體現(xiàn)在自動生成了commit且**工作區(qū)間** 代碼很多沖突帮哈。使**工作區(qū)間**代碼跟線上代碼一致且刪除新生成的commit膛檀。
![7.png](http://upload-images.jianshu.io/upload_images/615809-8f87fdd8461d2232.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**對應(yīng)指令:**
```
// 本地工作區(qū)間代碼回退到遠程版本 
git reset –-hard origin/master 
```
寫到了git reset指令, 就不得不說下它與 git revert 的區(qū)別:
> 1. git revert是用一次新的commit來回滾之前的commit娘侍,git reset是直接刪除指定的commit咖刃。

> 2. 在回滾這一操作上看,效果差不多憾筏。但是在日后繼續(xù)merge以前的老版本時有區(qū)別嚎杨。因為git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時氧腰,導(dǎo)致這部分改變不會再次出現(xiàn)枫浙,但是git reset是直接把某些commit在某個branch上刪除刨肃,因而和老的branch再次merge時,這些被回滾的commit應(yīng)該還會被引入箩帚。

> 3. git reset 是把HEAD向后移動了一下真友,而git revert是HEAD繼續(xù)前進,只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反紧帕,能夠抵消要被revert的內(nèi)容盔然。

git reset 與 git revert區(qū)別圖:

![8.png](http://upload-images.jianshu.io/upload_images/615809-6a56dbb1295896a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![9.png](http://upload-images.jianshu.io/upload_images/615809-cc57f6657b49ce6d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 5.遠程倉庫代碼回滾(線上代碼回滾)
場景: 提交了一個commit(該提交包含很多文件), 發(fā)現(xiàn)有問題是嗜, 需要回滾愈案, 將線上分支(master)回滾到上一次commit;
網(wǎng)上有刪除分支進行線上代碼回滾的教程, 那種操作其實很危險鹅搪, 因為一般線上的分支是master分支站绪, 而這個分支不允許刪除。
合理一些的是使用 git reset或git revert方式進行回滾丽柿;
**git reset方式圖解:**

![10.png](http://upload-images.jianshu.io/upload_images/615809-a569b67b955fed97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**git revert方式圖解:**

![11.png](http://upload-images.jianshu.io/upload_images/615809-05f9b43a8565df67.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我們可以使用git revert將新的commit替換掉;(不用git reset而用git revert的原因是保留commit方便后續(xù)代碼恢復(fù))
**對應(yīng)指令:**
```
// 替換掉上次提交的代碼文件(上次的commit記錄會保留)
git revert HEAD
git commit -m "回滾上次commit"
git push origin master
```
參考資料:
[時光機穿梭 - 廖雪峰的官方網(wǎng)站](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743858312764dca7ad6d0754f76aa562e3789478044000)
[GitHub - wteam-xq/testGit: git學(xué)習恢准、博文測試工程](https://github.com/wteam-xq/testGit)
[Git HowTo: revert a commit already pushed to a remote repository](http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html)
相關(guān)文章:
[Git 圖解(1):代碼區(qū)域總結(jié)](http://www.reibang.com/p/898e766d22e1)
[Git 圖解(3):分支操作](http://www.reibang.com/p/342a9f8db004)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市航厚,隨后出現(xiàn)的幾起案子顷歌,更是在濱河造成了極大的恐慌,老刑警劉巖幔睬,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眯漩,死亡現(xiàn)場離奇詭異,居然都是意外死亡麻顶,警方通過查閱死者的電腦和手機赦抖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辅肾,“玉大人队萤,你說我怎么就攤上這事〗玫觯” “怎么了要尔?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長新娜。 經(jīng)常有香客問我赵辕,道長,這世上最難降的妖魔是什么概龄? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任还惠,我火速辦了婚禮,結(jié)果婚禮上私杜,老公的妹妹穿的比我還像新娘蚕键。我一直安慰自己救欧,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布锣光。 她就那樣靜靜地躺著笆怠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫉晶。 梳的紋絲不亂的頭發(fā)上骑疆,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天田篇,我揣著相機與錄音替废,去河邊找鬼。 笑死泊柬,一個胖子當著我的面吹牛椎镣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兽赁,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼擂达,長吁一口氣:“原來是場噩夢啊……” “哼钻趋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓢湃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盏求,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噪漾,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年蜂莉,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜡娶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡映穗,死狀恐怖窖张,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚁滋,我是刑警寧澤宿接,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站辕录,受9級特大地震影響睦霎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踏拜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一碎赢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧速梗,春花似錦肮塞、人聲如沸襟齿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猜欺。三九已至,卻和暖如春拷窜,著一層夾襖步出監(jiān)牢的瞬間开皿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工篮昧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赋荆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓懊昨,卻偏偏與公主長得像窄潭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子酵颁,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,478評論 1 26
  • 這個問題確實很奇妙躏惋,挫敗感這種東西吧幽污,畢竟很難受。尤其是幾乎快贏的情況下輸了簿姨,更是想砸鍵盤距误。總結(jié)了一下款熬,讓我很難受...
    咳咳酥麻閱讀 1,531評論 0 0
  • 我認為成長的意義就是少了些對未來的期待深寥,多了些對當下的專注。有些感性虛化的東西得以理性實化贤牛。當腳...
    紫樓蘭閱讀 289評論 0 2
  • 珍藏版:幾款健脾藥怎使用: 1,人參健脾丸實用人群:經(jīng)常大便不成型惋鹅,碎碎雜雜的,吃什么拉什么殉簸,這是消化不好闰集,...
    天道酬勤瑰芳閱讀 705評論 0 3
  • 一個人強大和一群人強大,就像經(jīng)常聽到的那樣般卑。一頭兇猛的狼絕對打不贏一群狼武鲁,一根筷子和一把筷子,團隊和個人....而...
    行未閱讀 194評論 0 1