現在,你已經學會了修改檔案,然後把修改提交到git版本庫,現在,再練習一次,修改readme.txt檔案如下:
git is a distributed version control system.
git is free software distributed under the gpl.
然後嘗試提交:
$ git add readme.txt
1 file changed, 1 insertion(+), 1 deletion(-)
像這樣,你不斷對檔案進行修改,然後不斷提交修改到版本庫里,就好比玩rpg遊戲時,每通過一關就會自動把遊戲狀態存檔,如果某一關沒過去,你還可以選擇讀取前一關的狀態。有些時候,在打boss之前,你會手動存檔,以便萬一打boss失敗了,可以從最近的地方重新開始。git也是一樣,每當你覺得檔案修改到一定程度的時候,就可以「儲存乙個快照」,這個快照在git中被稱為commit
。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的乙個commit
恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。
現在,我們回顧一下readme.txt檔案一共有幾個版本被提交到git倉庫裡了:
版本1:wrote a readme file
git is a version control system.
git is free software.
版本2:add distributed
git is a distributed version control system.
git is free software.
git is a distributed version control system.
git is free software distributed under the gpl.
當然了,在實際工作中,我們腦子裡怎麼可能記得乙個幾千行的檔案每次都改了什麼內容,不然要版本控制系統幹什麼。版本控制系統肯定有某個命令可以告訴我們歷史記錄,在git中,我們用git log
命令檢視:
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
author: michael liao
date: tue aug 20 15:11:49 2013 +0800
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
author: michael liao
date: tue aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
author: michael liao
date: mon aug 19 17:51:55 2013 +0800
wrote a readme file
$ git log --pretty=oneline
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
需要友情提示的是,你看到的一大串類似3628164...882e1e0
的是commit id
(版本號),和svn不一樣,git的commit id
不是1,2,3……遞增的數字,而是乙個sha1計算出來的乙個非常大的數字,用十六進製制表示,而且你看到的commit id
和我的肯定不一樣,以你自己的為準。為什麼commit id
需要用這麼一大串數字表示呢?因為git是分布式的版本控制系統,後面我們還要研究多人在同乙個版本庫里工作,如果大家都用1,2,3……作為版本號,那肯定就衝突了。
每提交乙個新版本,實際上git就會把它們自動串成一條時間線。如果使用視覺化工具檢視git歷史,就可以更清楚地看到提交歷史的時間線:
好了,現在我們啟動時光穿梭機,準備把readme.txt回退到上乙個版本,也就是「add distributed」的那個版本,怎麼做呢?
首先,git必須知道當前版本是哪個版本,在git中,用head
表示當前版本,也就是最新的提交3628164...882e1e0
(注意我的提交id和你的肯定不一樣),上乙個版本就是head^
,上上乙個版本就是head^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成head~100
。
$ git reset --hard head^
head is now at ea34578 add distributed
--hard
引數有啥意義?這個後面再講,現在你先放心使用。
看看readme.txt的內容是不是版本add distributed
:
$ cat readme.txt
git is a distributed version control system.
git is free software.
果然。
還可以繼續回退到上乙個版本wrote a readme file
,不過且慢,然我們用git log
再看看現在版本庫的狀態:
$ git log
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
author: michael liao
date: tue aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
author: michael liao
date: mon aug 19 17:51:55 2013 +0800
wrote a readme file
$ git reset --hard 3628164
head is now at
版本號沒必要寫全,前幾位就可以了,git會自動去找。當然也不能只寫前一兩位,因為git可能會找到多個版本號,就無法確定是哪乙個了。
再小心翼翼地看看readme.txt的內容:
$ cat readme.txt
git is a distributed version control system.
git is free software distributed under the gpl.
果然,我胡漢三又回來了。
現在,你回退到了某個版本,關掉了電腦,第二天早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id
怎麼辦?
$ git
reflog
ea34578
head
@: reset: moving
tohead^
3628164 head
gplea34578
head
@: commit: add
distributed
cb926e7
head
@: commit (initial): wrote
areadme
file
現在總結一下: Git學習筆記(三) 版本回退
實際工作中,乙個檔案可能被提交過多次,我們可以用git log命令來檢視提交記錄 可以看見我提交過兩次,並且有每次提交時候的說明,如果嫌輸出的資訊太多,可以加上這個引數 pretty oneline 如果你想回退一次操作,你該怎麼做呢?在git中,用head表示當前版本,也就是最新的提交69e77....
Git 三 版本回退 撤消修改 檔案刪除
檢視git操作日誌 git log 單行格式檢視操作日誌 git log pretty oneline 還原操作到上一次版本,有幾個 就上幾次 git reset hard head 還原操作到某一次版本,後面的是版本code git reset hard e6ded2 撤銷修改,在add之前的修改...
Git 七 版本回退
現在,你已經學會了修改檔案,然後把修改提交到git版本庫,現在,再練習一次,修改readme.txt檔案如下 git is a distributed version control system.git is free software distributed under the gpl.然後嘗試...