我們?cè)谑褂胓it進(jìn)行版本管理的時(shí)候,如果遇到需要回退代碼的情況,一般會(huì)用 git reset 命令。
我們大致了解一下git大致的工作流程。

首先,想象一下,我正在寫(xiě)著我的代碼,這個(gè)狀態(tài)對(duì)應(yīng)圖中的 Working diretory,
這個(gè)時(shí)候,我的代碼還就是我的,跟 git 半毛錢關(guān)系都沒(méi)有。(在Android Studio中對(duì)應(yīng)文件顏色是紅色)
然后,我把當(dāng)前編輯的 A 文件 add 到 git 中,這個(gè)時(shí)候就跟 git 發(fā)生了關(guān)系,git 接受了我的代碼,然后把這個(gè)文件存入了自己的暫存區(qū),后面我對(duì)這個(gè)文件的更改 ,git 都會(huì)知曉。這個(gè)狀態(tài)對(duì)應(yīng)圖中的 Stage/Index(在Android Studio中對(duì)應(yīng)文件顏色是綠色或者藍(lán)色)
我把寫(xiě)好的 A 文件 commit 到 git ,這就有了一次提交歷史。對(duì)應(yīng)圖中的 History,在 git 中只要 commit 過(guò)的文件,都有各種方式可以恢復(fù),基本來(lái)說(shuō),就是不會(huì)丟了(在Android Studio中對(duì)應(yīng)文件顏色是白色)
好的,那么現(xiàn)在,我發(fā)現(xiàn)代碼寫(xiě)的不好,需要回退到上一次的提交,我有幾個(gè)命令可以選擇。
常見(jiàn)以下幾種命令:
git reset --hard
git reset --soft
git reset --hard xxx與git reset --soft
git reset --hard
這個(gè)命令 非常危險(xiǎn) ,是 git 中少有的幾個(gè)會(huì)丟失信息的操作。它會(huì)把回退點(diǎn)之前的所有信息都刪掉,一個(gè)不留,干干凈凈。
舉個(gè)例子:
現(xiàn)在我把 A文件修改了兩次,到了C 狀態(tài) ,并且已提交。
那么我的分支指針是指向 C , 當(dāng)前文件編輯的狀態(tài)也是在C
(F)
A-B-C
?????????↑
master
我輸入了git reset --hard,結(jié)果會(huì)變成:
(F)
A-B
????↑
master
對(duì)的, C 狀態(tài)徹底沒(méi)有,再也找不回來(lái)。所以,沒(méi)事不要用這個(gè)命令。
git reset --soft
同樣是這個(gè)狀態(tài):
(F)
A-B-C
???????? ↑
master
我輸入了git reset --soft,結(jié)果是:
(F)
A-B-C
???? ↑
master
文件狀態(tài)與分支的指針都指向上一個(gè)提交,C 還是在的,只是沒(méi)顯示。
git revert HEAD
>git revert 撤銷某次操縱,此次造作之前和之后的commit和history都會(huì)保留,并且把這次撤銷作為一次最新的提交。
- git revert --HEAD 撤銷前一次的commit
- git revert --HEAD^ 撤銷前前一次的commit
- git revert commit (commit 內(nèi)容為指定撤銷的版本號(hào):如d5b992cc5578c67f988f9684e91a6ce13d80473d),同樣撤銷也會(huì)作為一次提交進(jìn)行保存。)
注:查看commit版本信息,指令為 git log
我對(duì)項(xiàng)目中的一個(gè)文件進(jìn)行的重命名操作。
原文件名:


然后將其然后將其提交到本地倉(cāng)庫(kù),這是好我們發(fā)現(xiàn)命名有問(wèn)題,需要返回原名,我們可以通過(guò)再次重命名操作,或者撤銷已經(jīng)提交到本地倉(cāng)庫(kù)的指令。
git revert --HEAD
效果:

可以清楚的看到revert指令讓我們的操作回退到commit操作的前一步,也就是未對(duì)文件名進(jìn)行更改的狀態(tài)。
代碼回滾常見(jiàn)命名的使用場(chǎng)景:
| 命令 | 作用域 | 常用情景 |
|---|---|---|
| git reset | 提交層面 | 在私有分支上舍棄一些沒(méi)有提交的更改 |
| git reset | 文件層面 | 將文件從緩存去中移除 |
| git checkout | 提交層面 | 切換分支或查看舊版本 |
| git checkout | 文件層面 | 舍棄工作目錄中的更改 |
| git revert | 提交層面 | 在公共分支上回滾更改 |
| git revert | 文件層面 | (沒(méi)有) |