Git 版本回退

2022-08-18 22:15:15 字數 3958 閱讀 3247

像git這種版本控制系統的作用就像我們遊戲中的存檔,git也是一樣,每當你覺得檔案修改到一定程度的時候,就可以「儲存乙個快照」,這個快照在git中被稱為commit。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的乙個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。

使用git log 告訴我們歷史記錄:顯示順序從最近到最遠

λ git log

commit c72e38e4abebd7bc0a33332af2a5f96df6598bf0 (head -> master)

author: gaoking <[email protected]>

date: sun jun 30 22:12:32 2019 +0800

'新增了單詞distributed'

commit 06bcd78a4d208dbba023a6e19367340117a468bc

author: gaoking <[email protected]>

date: sun jun 30 21:53:14 2019 +0800

'新增了三個檔案'

commit b30fedbae168a3af37f589ea58102bf7a87f93d7

author: gaoking <[email protected]>

date: sun jun 30 21:49:56 2019 +0800

建立了乙個readme.txt

果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上--pretty=oneline引數:

λ git log --pretty=oneline

7acc5230bf659da048f6e532ce944400c73902cc (head -> master) '再次修改readme.txt'

c72e38e4abebd7bc0a33332af2a5f96df6598bf0 '新增了單詞distributed'

06bcd78a4d208dbba023a6e19367340117a468bc '新增了三個檔案'

b30fedbae168a3af37f589ea58102bf7a87f93d7 建立了乙個readme.txt

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

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

#錯誤的乙個

λ git reset --hard head^

more?

more? y

fatal: ambiguous argument 'head

y': unknown revision or path not in the working tree.

use '--' to separate paths from revisions, like this:

'git [...] -- [...]'

#以為正確的,大意了,看到資訊不一樣就沒有細看

λ git reset head^ --hard

head is now at 7acc523 '再次修改readme.txt'

#真正正確的

λ git reset --hard head^^

head is now at c72e38e '新增了單詞distributed'

λ git reset --hard head~1

head is now at 06bcd78 '新增了三個檔案'

錯誤的原因:

因為cmd中^是轉義符號,相當於linux的\,當出現在行尾的時候含義是這行還沒寫完,無視行尾的換行符,下行的內容實際執行的時候理解為直接接在上一行尾上。所以你^結尾會提示你more,就是讓你輸入下一行的內容。解決方法有用雙引號括上強行指定為字串內容"^",或者用兩個^,即^^,前乙個轉義後乙個,代表乙個沒有特殊含義的字元^本身。如果你要用n個^,就要寫2n個^。cmd中是這樣,所以git cmd也是這樣,git bash是unix風格,應該就沒有這個問題。

檢視一下

λ cat readme.txt

git is a version control system.

git is free software.

λ git log --pretty=oneline

06bcd78a4d208dbba023a6e19367340117a468bc (head -> master) '新增了三個檔案'

b30fedbae168a3af37f589ea58102bf7a87f93d7 建立了乙個readme.txt

λ git reset --hard c72e

head is now at c72e38e '新增了單詞distributed'

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

那要是在前面我們找不到了commit id了怎麼辦,git有回退到過去可以用head,但是要回到未來,就必須有commit id,我們可以執行git reflog命令來檢視不同版本的commit id

λ git reflog

c72e38e (head -> master) head@: reset: moving to c72e

06bcd78 head@: reset: moving to head~1

c72e38e (head -> master) head@: reset: moving to head^

7acc523 head@: reset: moving to head

7acc523 head@: commit: '再次修改readme.txt'#這個是最近的

c72e38e (head -> master) head@: commit: '新增了單詞distributed'#比如這個版本的id 就是 c72e38e,這個是當前的

06bcd78 head@: commit: '新增了三個檔案'

b30fedb head@: commit (initial): 建立了乙個readme.txt

我們回到未來:『再次修改readme.txt'

λ git reset --hard 7acc523

head is now at 7acc523 '再次修改readme.txt'

λ cat readme.txt

git is a distributed version control system.

git is free software distributed under the gpl.

ok!

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 會顯示提交日誌,但是嫌輸出過多怎麼辦,...