我們?cè)谑褂胓it進(jìn)行版本管理的時(shí)候,如果遇到需要回退代碼的情況服爷,一般會(huì)用 git reset 命令杜恰。
我們大致了解一下git大致的工作流程。
首先仍源,想象一下心褐,我正在寫著我的代碼,這個(gè)狀態(tài)對(duì)應(yīng)圖中的 Working diretory笼踩,
這個(gè)時(shí)候檬寂,我的代碼還就是我的,跟 git 半毛錢關(guān)系都沒有戳表。(在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)色)
我把寫好的 A 文件 commit 到 git 持舆,這就有了一次提交歷史。對(duì)應(yīng)圖中的 History伪窖,在 git 中只要 commit 過的文件逸寓,都有各種方式可以恢復(fù),基本來說覆山,就是不會(huì)丟了(在Android Studio中對(duì)應(yīng)文件顏色是白色)
好的竹伸,那么現(xiàn)在,我發(fā)現(xiàn)代碼寫的不好簇宽,需要回退到上一次的提交勋篓,我有幾個(gè)命令可以選擇。
常見以下幾種命令:
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)徹底沒有疯汁,再也找不回來牲尺。所以卵酪,沒事不要用這個(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 還是在的,只是沒顯示蜒简。
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)命名有問題麸折,需要返回原名,我們可以通過再次重命名操作粘昨,或者撤銷已經(jīng)提交到本地倉(cāng)庫(kù)的指令垢啼。
git revert --HEAD
效果:
可以清楚的看到revert指令讓我們的操作回退到commit操作的前一步,也就是未對(duì)文件名進(jìn)行更改的狀態(tài)张肾。
代碼回滾常見命名的使用場(chǎng)景:
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交層面 | 在私有分支上舍棄一些沒有提交的更改 |
git reset | 文件層面 | 將文件從緩存去中移除 |
git checkout | 提交層面 | 切換分支或查看舊版本 |
git checkout | 文件層面 | 舍棄工作目錄中的更改 |
git revert | 提交層面 | 在公共分支上回滾更改 |
git revert | 文件層面 | (沒有) |