Git如何實(shí)現(xiàn)撤銷提交(命令行+IDEA)
概覽、Git代碼管理的幾個(gè)狀態(tài)及倒回

一、基于命令行
1. 工作區(qū)的代碼想撤銷
可能有一天我正在寫(xiě)代碼,寫(xiě)了很久發(fā)現(xiàn)寫(xiě)錯(cuò)了,想恢復(fù)到一開(kāi)始的狀態(tài),一個(gè)笨辦法就是把剛剛寫(xiě)的代碼一行一行的刪除,不過(guò)這種方式成本太高,我們可以通過(guò)git checkout – <file> 命令來(lái)撤銷工作區(qū)的代碼修改。
如下圖:

首先我們執(zhí)行了 git status 命令,發(fā)現(xiàn)工作區(qū)是干凈的,然后執(zhí)行了 cat 命令,發(fā)現(xiàn)文件只有兩行內(nèi)容,然后通過(guò) vi 編輯器向文件中添加一行,保存并退出,退出來(lái)之后又執(zhí)行了 git status 命令,此時(shí)工作區(qū)的狀態(tài)已經(jīng)發(fā)生變化,然后我們執(zhí)行了 git checkout – git01.txt 命令,表示撤銷之前的操作,讓 git01.txt 恢復(fù)到之前的狀態(tài),該命令執(zhí)行成功之后,我們?cè)賵?zhí)行 cat 命令發(fā)現(xiàn)文件內(nèi)容已經(jīng)恢復(fù)了,此時(shí)再執(zhí)行 git status,狀態(tài)也恢復(fù)了。
總結(jié)
git status 回顯 modified: yourfile git checkout -- yourfile git status 回顯working tree clean
2. add到暫存區(qū)的代碼想撤銷
如果想要撤銷,但是代碼已經(jīng)提交到暫存區(qū)了,不用擔(dān)心,也能撤銷,分兩個(gè)步驟:
- 將暫存區(qū)的代碼撤銷到工作區(qū)
- 將工作區(qū)的代碼撤銷(具體操作和1小節(jié)一致)
將暫存區(qū)的代碼撤銷,我們可以使用 git reset HEAD 命令來(lái)實(shí)現(xiàn)。
如下圖:

這里的代碼都比較簡(jiǎn)單,核心的過(guò)程就是先執(zhí)行 git reset HEAD 命令,從暫存區(qū)撤銷,剩下的操作參考 1 小節(jié)。
總結(jié)
git add afile git status git reset HEAD git status git checkout -- afile git status
3. 提交到本地倉(cāng)庫(kù)的代碼想撤銷
同樣的,提交到本地倉(cāng)庫(kù)的代碼一樣也可以撤銷,我們可以利用 git reset --hard <版本號(hào)> 命令來(lái)實(shí)現(xiàn)版本回退,該命令中的版本號(hào)有幾種不同的寫(xiě)法:
可以使用 HEAD^ 來(lái)描述版本,一個(gè) ^ 表示前一個(gè)版本,兩個(gè) ^^ 表示前兩個(gè)版本,以此類推。
也可以使用數(shù)字來(lái)代替 ^,比如說(shuō)前 100 個(gè)版本可以寫(xiě)作 HEAD~100。
也可以直接寫(xiě)版本號(hào),表示跳轉(zhuǎn)到某一個(gè)版本處。我們每次提交成功后,都會(huì)生成一個(gè)哈希碼作為版本號(hào),所以這里我們也可以直接填版本號(hào),哈希碼很長(zhǎng),但是我們不用全部輸入,只需要輸入前面幾個(gè)字符即可,就能識(shí)別出來(lái)。
看下面一系列的操作:
通過(guò) git log 查看當(dāng)前提交日志:

git log --pretty=short
通過(guò) git reset HEAD^^ 向前回退兩個(gè)版本:

git reset --hard HEAD^^
查看日志,發(fā)現(xiàn)最后一次提交的版本號(hào)是 695ce1fe,利用 git reset --hard 695ce1fe 命令回退:

git reset --hard 695ce1fe
通過(guò) git reset --hard HEAD~1 回到上一個(gè)版本:

git reset --hard HEAD~1
當(dāng)然以上操作都是基于命令行的,如果你命令行操作比較熟練的話,其實(shí)命令行操作比 IDEA 上點(diǎn)點(diǎn)點(diǎn)要快很多。
4. 遠(yuǎn)程倉(cāng)庫(kù)的代碼想要撤銷
如果代碼提交到遠(yuǎn)程倉(cāng)庫(kù)了,想要撤銷,那就如 3 小節(jié)所講,先在本地倉(cāng)庫(kù)撤銷,然后 push 到遠(yuǎn)程倉(cāng)庫(kù)即可。
二、基于 IDEA
1. 未提交就撤銷
對(duì)于第一小節(jié)的前兩種撤銷操作,即修改的文件還沒(méi) commit,此時(shí)想要撤銷,方式很簡(jiǎn)單,點(diǎn)擊 IDEA 右上角的撤銷按鈕:

如果你修改了文件,無(wú)論有沒(méi)有執(zhí)行 git add 命令,只要沒(méi)有 commit,都可以通過(guò)這個(gè)按鈕撤銷修改,點(diǎn)擊該按鈕,彈出如下提示框:

這里會(huì)列出來(lái)所有修改但是沒(méi)有 commit 的文件,想要撤銷哪個(gè)文件的修改,就勾選該文件,然后點(diǎn)擊 Rollback 按鈕就完成了撤銷操作。
2. commit 了想撤銷
如果已經(jīng) commit 了,那么就需要先打開(kāi)提交日志,點(diǎn)擊如下按鈕打開(kāi):

也可以直接點(diǎn)擊 IDEA 右上角的時(shí)鐘圖標(biāo),快速打開(kāi)提交日志:

提交日志類似下面這樣:

此時(shí)的回退就分情況了。
首先這個(gè)撤銷操作分兩種:
- Revert Commit
- Undo Commit
我們分別來(lái)看。
Undo Commit
Undo Commit 這個(gè)操作只能在最近一次提交上使用,不能在其他提交上使用,最近一次 commit 上,右鍵單擊,如下圖:

其他的 commit 上右鍵單擊:

既然如此,我們就來(lái)看看最近的一次 commit 如何 Undo Commit。
在最近一次 commit 日志上右鍵單擊后選擇 Undo Commit,如下圖:

選中后,直接點(diǎn)擊 OK,撤銷最近一次的 commit。
這就是撤銷最近一次 commit,撤銷之后,本地的修改相當(dāng)于變成了已 add 但是未 commit 的狀態(tài),此時(shí)我們可以繼續(xù)開(kāi)發(fā)新代碼,然后再 commit,再 push;或者也可以像 1 小節(jié)介紹的那樣,繼續(xù)撤銷操作。
我電腦上的 IDEA 在這塊操作中有個(gè)偶發(fā)性問(wèn)題,就是撤銷掉 commit 之后,IDEA 檢測(cè)不到文件處于未提交狀態(tài),需要我把 IDEA 關(guān)掉重新打開(kāi),IDEA 就能發(fā)現(xiàn)文件處于未提交狀態(tài)了,此時(shí)就可以按照 1 小節(jié)的步驟繼續(xù)回退了,這塊小伙伴們?cè)谠囼?yàn)的時(shí)候可以留意下。
Revert Commit
Revert Commit 這個(gè)操作到處都能用,不同于 Undo Commit,Revert Commit 之后,會(huì)產(chǎn)生一條提交記錄。相當(dāng)于 Revert Commit 其實(shí)也是提交,只不過(guò)提交的內(nèi)容剛好相反,剛好刷掉已有內(nèi)容。
Revert Commit 操作可以用在所有的日志上,而不僅僅是剛剛提交的 commit。
操作方式如下:
找到需要回滾的地方,右鍵單擊,選擇 Revert Commit:

此時(shí)會(huì)彈出來(lái)一個(gè)提交的對(duì)話框,就是一個(gè)普普通通的 commit 對(duì)話框,如下:

commit 之后,可以看到內(nèi)容已經(jīng)撤銷了,提交日志中也多了一條記錄,如下圖:

3. push 了想撤銷
如果已經(jīng) push 到遠(yuǎn)程倉(cāng)庫(kù)了,怎么撤銷?
其實(shí)跟 2 小節(jié)一樣,先在本地倉(cāng)庫(kù)撤銷,撤銷完成后,重新修改代碼,最后再 force push 就行了,不過(guò) force push 的時(shí)候,注意別把同事的代碼給覆蓋了。
所以一定是先commit到本地倉(cāng)庫(kù),改完確認(rèn)了再push到遠(yuǎn)程倉(cāng)庫(kù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
WebSocket部署到服務(wù)器出現(xiàn)連接失敗問(wèn)題的分析與解決
這篇文章主要給大家介紹了關(guān)于WebSocket部署到服務(wù)器出現(xiàn)連接失敗問(wèn)題的分析與解決方法,文中給出了詳細(xì)的介紹供大家參考學(xué)習(xí),文末也給出了demo下載地址,需要的朋友們可以下載學(xué)習(xí),下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
提高github下載速度的方法可達(dá)到2MB/s(100%有效)
這篇文章主要介紹了提高github下載速度的方法可達(dá)到2MB/s(100%有效),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
vscode 一鍵規(guī)范代碼格式的實(shí)現(xiàn)
這篇文章主要介紹了vscode 一鍵規(guī)范代碼格式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
jQuery會(huì)死嗎?我為什么不用vue寫(xiě)富文本
jQuery會(huì)死嗎?我為什么不用vue寫(xiě)富文本,本文通過(guò)文字實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
使用TeXLive2022和VSCode安裝配置步驟(LaTeX寫(xiě)論文)
這篇文章主要介紹了使用TeXLive2022和VSCode的安裝配置步驟,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

