Git版本回退和撤銷修改

2022-08-22 16:18:09 字數 2176 閱讀 4343

版本回退:

在實際工作中,我們會不斷對檔案進行修改,然後不斷提交修改到版本庫里,一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的乙個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。

在git中,我們用git log命令檢視修改記錄:

git log命令顯示從最近到最遠的提交日誌

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

需要友情提示的是,你看到的一大串類似9b5f63fle8515...的是commit id(版本號),和svn不一樣,git的commit id不是1,2,3……遞增的數字,而是乙個sha1計算出來的乙個非常大的數字,用十六進製制表示,而且你看到的commit id和我的肯定不一樣,以你自己的為準。

為什麼commit id需要用這麼一大串數字表示呢?因為git是分布式的版本控制系統,後面我們還要研究多人在同乙個版本庫里工作,如果大家都用1,2,3……作為版本號,那肯定就衝突了。

每提交乙個新版本,實際上git就會把它們自動串成一條時間線。如果使用視覺化工具檢視git歷史,就可以更清楚地看到提交歷史的時間線。

現在我準備把readme2.txt回退到上乙個版本

首先,git必須知道當前版本是哪個版本,在git中,用head表示當前版本,也就是最新的提交9b5f63f1e...,上乙個版本就是head^,上上乙個版本就是head^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成head~100。

然後使用git reset命令:

果然被還原了,這時我們用git log再看看現在版本庫的狀態:

最新的那個版本已經看不到了!想再回去已經回不去了,腫麼辦?

只要上面的命令列視窗還沒有被關掉,你就可以順著往上找到上面最新的commit id是9b5f63f...,於是就可以指定回到未來的某個版本:

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

git的版本回退速度非常快,因為git在內部有個指向當前版本的head指標,當你回退版本的時候,git僅僅是把head指向變了,然後順便把工作區的檔案更新了。所以你讓head指向哪個版本號,你就把當前版本定位在哪。

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

git提供了乙個命令git reflog用來記錄你的每一次命令,然後你可以根據對應的commit id回到你想要的版本:

撤銷修改:

如果你在本地改了乙個檔案但是還沒有add到暫存區,現在你想撤銷,這時你可以用 git checkout -- file 命令丟棄工作區的修改,讓這個檔案回到最近一次git commit或git add時的狀態。

但是如果你的修改已經git add到暫存區了,慶幸的是,在commit之前,你發現了這個問題。用git status檢視一下,修改只是新增到了暫存區,還沒有提交,這時用命令git reset head 可以把暫存區的修改撤銷掉(unstage),重新放回工作區,然後再用git checkout -- file 丟棄工作區的修改:

現在,假設你不但改錯了東西,還從暫存區提交到了版本庫,怎麼辦呢?可以使用版本回退到上乙個版本。不過,這是有條件的,就是你還沒有把自己的本地版本庫推送到遠端。一旦你把錯誤**提交推送到遠端版本庫,記錄就無法擦除了。

Git 版本回退和撤銷修改

將版本庫回退乙個版本,且這次提交的所有檔案都移動到暫存區 將版本庫回退乙個版本,且這次提交的所有檔案都移動到工作區,會重置暫存區 將版本庫回退乙個版本,會重置暫存區,工作區會回退到這個版本,即之前提交修改的檔案不會存在 git checkout filename注 checkout 命令沒有 的話就...

git撤銷修改和版本回退

由於一直分不請楚如何工作區的修改 沒有add 暫存區的修改 已add未commit 已提交的修改 已commit 所以參考了大佬的部落格抽時間做了乙個整理。工作區就是我們平常 存放的git初始化的目錄。版本庫就是目錄裡的隱藏檔案 git 而版本庫中的stage就是暫存區 git add file 提...

git 撤銷修改和版本回退

檔案只是在工作區進行了修改,還沒有提交到暫存區 未進行 git add 操作 此時可以使用git checkout filename撤銷工作區檔案的修改 效果相當於刪除本地的檔案,重新從遠端倉庫拉取該檔案 檔案在工作區進行了修改,並提交到了暫存區 進行了 git add 操作,未進行 commit ...