GIT 版本回退

2022-05-02 11:27:06 字數 4418 閱讀 3730

版本回退

再練習一次,修改readme.txt檔案如下:

test git modify second

study git

提交:

$ git add readme.txt

$ git commit -m "two modify"

[master 01c05cf] two modify

1 file changed, 1 insertion(+), 1 deletion(-)

像這樣,你不斷對檔案進行修改,然後不斷提交修改到版本庫里,就好比玩rpg遊戲時,每通過一關就會自動把遊戲狀態存檔,如果某一關沒過去,你還可以選擇讀取前一關的狀態。有些時候,在打boss之前,你會手動存檔,以便萬一打boss失敗了,可以從最近的地方重新開始。git也是一樣,每當你覺得檔案修改到一定程度的時候,就可以「儲存乙個快照」,這個快照在git中被稱為commit。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的乙個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。

現在,我們回顧一下readme.txt檔案一共有幾個版本被提交到git倉庫裡了:

版本1備註:first git

test git

study git

版本2:first modify

test git modify

study git

版本3:two modify

test git modify second

study git

當然了,在實際工作中,我們腦子裡怎麼可能記得乙個幾千行的檔案每次都改了什麼內容,不然要版本控制系統幹什麼。版本控制系統肯定有某個命令可以告訴我們歷史記錄,在git中,我們用git log命令檢視:  

$ git log

commit 01c05cf4e21ce0618b4f51a1bd79fe77e9c07ffd

author: unknown <[email protected]>

date: thu apr 21 22:42:54 2016 +0800

two modify

commit 1acafa7375ee0479b1a19ed18a167a9af8744a04

author: unknown <[email protected]>

date: thu apr 21 22:38:48 2016 +0800

first modify

commit 09c1bba66362260b71b5ec1c8005e00f57ca3dcf

author: unknown <[email protected]>

date: thu apr 21 22:22:54 2016 +0800

first git

git log命令顯示從最近到最遠的提交日誌,我們可以看到3次提交,最近的一次是two modify,上一次是first modify,最早的一次是first git。 如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上--pretty=oneline引數:

$ git log --pretty=oneline

01c05cf4e21ce0618b4f51a1bd79fe77e9c07ffd two modify

1acafa7375ee0479b1a19ed18a167a9af8744a04 first modify

09c1bba66362260b71b5ec1c8005e00f57ca3dcf first git

需要友情提示的是,你看到的一大串類似3628164...882e1e0的是commit id(版本號),和svn不一樣,git的commit id不是1,2,3……遞增的數字,而是乙個sha1計算出來的乙個非常大的數字,用十六進製制表示,而且你看到的commit id和我的肯定不一樣,以你自己的為準。為什麼commit id需要用這麼一大串數字表示呢?因為git是分布式的版本控制系統,後面我們還要研究多人在同乙個版本庫里工作,如果大家都用1,2,3……作為版本號,那肯定就衝突了。

好了,現在我們啟動時光穿梭機,準備把readme.txt回退到上乙個版本,也就是「first modify」的那個版本,怎麼做呢?

首先,git必須知道當前版本是哪個版本,在git中,用head表示當前版本,也就是最新的提交3628164...882e1e0(注意我的提交id和你的肯定不一樣),上乙個版本就是head^,上上乙個版本就是head^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成head~100

$ git reset --hard head^

head is now at 1acafa7 first modify

--hard引數有啥意義?這個後面再講,現在你先放心使用。

看看readme.txt的內容是不是版本add distributed

$ cat readme.txt

test git modify

study git

果然。還可以繼續回退到上乙個版本first git,不過且慢,然後我們用git log再看看現在版本庫的狀態:

$ git log

commit 1acafa7375ee0479b1a19ed18a167a9af8744a04

author: unknown <[email protected]>

date: thu apr 21 22:38:48 2016 +0800

first modify

commit 09c1bba66362260b71b5ec1c8005e00f57ca3dcf

author: unknown <[email protected]>

date: thu apr 21 22:22:54 2016 +0800

first git

$ git reset --hard 01c05cf4e21ce

head is now at 01c05cf two modify

版本號沒必要寫全,前幾位就可以了,git會自動去找。當然也不能只寫前一兩位,因為git可能會找到多個版本號,就無法確定是哪乙個了。

再小心翼翼地看看readme.txt的內容:

$ cat readme.txt

test git modify second

study git

果然,又回來了。

git的版本回退速度非常快,因為git在內部有個指向當前版本的head指標,當你回退版本的時候,git僅僅是把head從指向two modify

改為指向first modify

然後順便把工作區的檔案更新了。所以你讓head指向哪個版本號,你就把當前版本定位在哪。

現在,你回退到了某個版本,關掉了電腦,第二天早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?

在git中,總是有後悔藥可以吃的。當你用$ git reset --hard head^回退到first modify版本時,再想恢復到two modify,就必須找到two modify的commit id。git提供了乙個命令git reflog用來記錄你的每一次命令:

$ git reflog

01c05cf head@: reset: moving to 01c05cf4e21ce

1acafa7 head@: reset: moving to head^

01c05cf head@: commit: two modify

1acafa7 head@: commit: first modify

09c1bba head@: commit (initial): first git

現在總結一下:

Git版本回退

1 檢視檔案修改歷史 git log 返回的是commit後的操作記錄 git log pretty oneline 也可以使用這個命令格式化日誌輸出 2 版本回退 git reset hard head 回退到上乙個版本 git reset hard head 100 會退到第100個版本,例如現...

git版本回退

先說今天遇到的問題,看到乙個config.php的配置檔案一直在修改的狀態下,但是和遠端的config.php是不一致的,我不需要提交它,但是看它在 modified的狀態下,很不爽,想刪除它,git rm config.php,然後git push了下,結果不僅把本地的config.php乾掉了,...

git版本回退

把修改後的版本通過命令提交到版本庫 第一步 git add 檔名 字尾 第二步 git commit m commit id 但是有時候想回去怎麼辦呢?當然萬能的git給我們提供了方法的。我們先檢視一下最近到最遠的提交紀錄操作如下 在命令航輸入 git log 會顯示提交日誌,但是嫌輸出過多怎麼辦,...