git代碼回滾的幾種方式

這仍是第一次寫關於git的文章,讓我不禁的想起了大學那會尚未接觸到git時的如噩夢般的版本控制。
每次若是代碼要有大的改動都要提早copy一份出來,最後以致於有多少次大的改動就有多少分文件,並且每個都不敢刪,寫到這好想配個圖,雖然我不造配哪一個圖合適啊,反正就是相似於1,2,3,4,5...。
言歸正傳,咱們要說的是後悔藥。
在工做中咱們必定都發生過這種狀況,但願把代碼會滾到某個節點中,git有多中代碼的回滾方式,這裏作一個總結。
首先咱們到區分幾個概念,工做區,暫存區,版本庫,。git

工做區

所謂工做區,即咱們電腦中所看到的目錄。app

版本庫

在工做區有一個隱藏目錄.git,這是Git的版本庫。spa

暫存區

Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。版本控制

下圖顯示了三者之間的關係,這是咱們瞭解git的基礎
圖片描述
圖中左側爲工做區,右側爲版本庫。在版本庫中左側區域是暫存區(stage),右側標記爲 "master / other" 的是 master 分支或其餘分支所表明的目錄樹。指針

當對工做區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新。code

當執行提交操做(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。對象

而咱們這裏所謂的後悔藥就是要講代碼會滾到某個提交歷史的方法,下面就針對各類不一樣狀況一一講解。索引

丟棄還沒有被提交到暫存區的代碼

1.git co -- file
其中 「--」 參數是必須的,不然就會變成切換分支。圖片

2.git stash 儲藏
git stash操做適用於,當你的工做進行到一半,此時還不想要提交,可是又必須切換到其餘分支工做的時候。
執行命令同步

git stash

stash 命令就會將你此時工做區的代碼存起來,待你想繼續工做時,執行

git stash apply

你就能夠從新應用你最後一次stash的內容了。此時的代碼就回到了你上次到一半的內容上了。

已經提交到暫存區

1.git reset

git reset HEAD~1

暫存區的目錄樹會被重寫,最後一次提交的內容會被丟棄,可是工做區不受影響。
可是加上 「--hard」 參數後,暫存區和工做目錄都同步到你指定的提交。也就是HEAD~1.

git reset --hard HEAD~1

2.git rm --cached file
改命令會直接從暫存區刪除文件,工做區則不作出改變。

已經提交到分支上的代碼

1.git checkout HEAD . / git checkout HEAD file

當執行該命令時,會用 HEAD 指向的 master 分支中的所有或者部分文件,替換暫存區和以及工做區中的文件。這個命令是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改動。

2.git reset --hard
其使用方法與上面講的git reset同樣,都是改變了暫存區的HEAD索引。

已經提交到遠程的代碼

1.git revert

git revert HEAD 撤銷前一次 commit

git revert HEAD^ 撤銷前前一次 commit

git revert fa042ce57 撤銷指定的版本,撤銷也會做爲一次提交進行保存。

與reset不一樣的是:

  1. revert不會捨棄原來的提交記錄,而是生成了一次新的提交。

  2. reset是撤回到某個指定的版本,而revert則是將某個指定的版本撤銷,也就是撤回到指定版本以前的一個版本上。

相關文章
相關標籤/搜索