Git 版本回退
原文連結:https://mp.weixin.qq.com/s/Rb6fNqvVdfHWRxc7zddPaQ
Git 中的撤銷操作,可以分為四類:
- 工作區的程式碼想撤銷
- add 到暫存區的程式碼想撤銷
- 提交到本地倉庫的程式碼想撤銷
- 遠端倉庫的程式碼想撤銷
1 基於命令列
1.1 工作區的程式碼想撤銷
可以通過git checkout -- <file>
命令來撤銷工作區的程式碼修改。
首先執行了git status
命令,發現工作區是乾淨的,然後執行了cat
命令,發現檔案只有兩行內容,然後通過 vi 編輯器向檔案中新增一行,儲存並退出,退出來之後又執行了git status
命令,此時工作區的狀態已經發生變化,然後執行了git checkout -- git01.txt
git01.txt
恢復到之前的狀態,該命令執行成功後,再執行cat
命令發現檔案內容已經恢復了,此時再執行git status
命令,狀態也恢復了。
1.2 add 到暫存區的程式碼想撤銷
通過以下兩個步驟即可:
- 將暫存區的程式碼撤銷到工作區;
- 將工作區的程式碼撤銷(具體操作和 1.1 一樣)。
將暫存區的程式碼撤銷,可以使用git reset HEAD
命令實現,如下:
核心過程就是先執行git reset HEAD
命令,從暫存區撤銷,然後參照 1.1 小節命令。
1.3 提交到本地倉庫的程式碼想撤銷
可以利用git reset --hard <版本號>
- 可以使用
HEAD^
來描述版本,一個^
表示前一個版本,兩個^^
表示前兩個版本,以此類推; - 也可以使用數字來代替
^
,比如說前 100 個版本可以寫作HEAD~100
; - 也可以直接寫版本號,表示跳轉到某一個版本處。每次提交後,都會生成一個雜湊碼作為版本號,所以這裡可以直接填版本號,雜湊碼很長,但是不用全部輸入,只需要輸入前面幾個字元即可。
通過以下幾個步驟為例:
- 通過
git log
檢視當前提交日誌;
- 通過
git reset --hard HEAD^^
向前回退兩個版本;
- 檢視日誌,發現最後一次提交的版本號是
695ce1fe
,利用git reset --hard 695ce1fe
- 通過
git reset --hard HEAD^
回退到上一個版本;
1.4 遠端倉庫程式碼撤銷
先在本地倉庫撤銷,然後 push 到遠端倉庫即可。
2 基於 IDEA
2.1 未提交就撤銷
對於 第一小節基於命令列 的前兩種撤銷操作,即修改的檔案還沒 commit,此時想要撤銷,非常簡單,點選 IDEA 工具欄的撤銷按鈕即可。
如果修改了檔案,無論有沒有執行git add
命令,只要沒有 commit,都可以通過撤銷按鈕來撤銷修改,點選該按鈕,彈出如下提示框:
這裡會列出來所有修改但是沒有 commit 的檔案,想要撤銷哪個檔案的修改,就勾選該檔案,然後點選 Rollback 按鈕就完成了撤銷操作。
2.2 commit 了想撤銷
如果已經 commit 了,那麼就需要先開啟提交日誌,點選如下按鈕開啟:
也可以點選 IDEA 工具欄的時鐘圖示,快速開啟提交日誌:
提交日誌類似下面這樣:
此時的回退分情況,有兩種:
- Undo Commit
- Revert Commit
下面分別介紹兩種情況。
2.2.1 Undo Commit
這個操作只能在最近一次提交上使用,不能在其它提交上使用,最近一次提交上右鍵單擊,如下:
如果在其它的 commit 上單擊,如下:
既然如此,就來看看如何在最近一次提交上實現 Undo Commit。
在最近一次提交 commit 日誌上右鍵單擊選擇 Undo Commit,如下:
選中後,直接點選 OK,撤銷最近一次的 Commit。撤銷之後,本地的修改相當於變成了已 add 但是未 commit 的狀態,此時可以繼續開發新程式碼,然後再 commit,再 push。
2.2.2 Revert Commit
這個操作到處都能用,不同於 Undo Commit,Revert Commit 之後,會產生一條提交記錄。相當於 Revert Commit 其實也是一次提交,只不過提交的內容剛好相反,剛好刷掉已有內容。
Revert Commit 操作可以用在所有的提交日誌上,而不僅僅是最近一次的提交。
具體操作步驟如下:
找到需要回退的地方,右鍵點選,選擇 Revert Commit:
此時會彈出來一個提交的對話方塊,就是一個普通的 commit 對話方塊,如下:
commit 之後,可以看到內容已經撤銷了,提交日誌中也多了一條記錄,如下:
2.3 push 了想撤銷
先在本地倉庫撤銷,撤銷完成後,重新修改程式碼,最後再 push 即可。
作者:超級鯊魚辣椒
轉載請註明原文連結:https://www.cnblogs.com/jinzlblog/p/15949162.html