Git回滾和撤銷---喫上後悔藥、坐上時光機

本文首發於公衆號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

Git系列

提交分3步:add、commit、push,回滾和撤銷也分3種情況:

  • 撤銷add
  • 撤銷commit
  • 回滾push,也就是回滾遠程倉庫的代碼

撤銷add

這種情況有可能是在 git add 操作的時候一些不必要的文件也加進來了,所以想撤銷,重新 add

add 操作前面我們已經學習了,它的本質就是將工作目錄中的文件的內容保存到了Git數據庫,並把文件名和對應的數據對象這些信息添加到了暫存區中。

由於添加的文件內容已經添加到Git數據庫中了,沒法刪除,所以我們不用管Git數據庫中的。我們可以刪除暫存區中的文件,以確保不會出現在提交記錄中。(那我要是這個文件就是一直不需要提交的,那Git數據庫中一直存在着?)

//刪除暫存區中的文件記錄
git rm --cached 文件名
//或是下面的命令,推薦用下面這種
git reset HEAD 文件名

上面2種方法有什麼區別呢?

git rm —cached 是直接刪除暫存區中的文件記錄,用 git ls-files —stage 命令查看暫存區會發現對應文件的記錄被刪除了,工作區的內容不會變;

git reset 是把內容恢復到指定的commit提交版本,上述命令中的HEAD就是表示最近一次提交。當文件之前沒有提交過時,效果就會等同於上面的命令;如果之前提交記錄裏有文件的其他版本,就會把暫存區的記錄更新到之前的版本,這樣以來對應文件內容就是之前的版本。

撤銷commit

同樣的,執行了commit 命令以後,就已經創建了 commit對象,並且存入了Git倉庫中,存入了就不能被刪除了。

那撤銷commit 本質是什麼?

之前我們已經學習過,commit的過程就是根據暫存區的內容,創建一個 commit 對象存入Git倉庫,同時這個commit 對象保存了上一個 commit 對象的信息,這樣就有了提交歷史記錄,與此同時更新當前分支指向新的commit。

撤銷commit 本質上就是將分支指向上一個commit

只不過有個問題,暫存區中的內容和工作區中的內容要不要跟着改呢?Git可以讓我們自己選——分別對應reset 的3個參數:mixed、soft和hard

  • mixed: 這個是默認值,效果是暫存區的內容會被替換,工作區的內容不變(也就是撤銷commit,同時撤銷add,需要重新add操作);
  • soft:效果是暫存區和工作區的內容都不會變,也就是不撤銷 add 操作;
  • hard:這個效果是暫存區的內容會被替換,工作區之前被跟蹤的文件內容會被替換
//回滾到上一次提交
git reset --hard HEAD^
//或者
git reset HEAD^ --hard

PS:如果只是想修改剛剛commit時寫的提交備註,不用 reset,可以用下面的命令:

//修改最新一次提交的說明信息
git commit --amend -m 新的說明信息

回滾push

首先,這是回滾公共倉庫中的代碼操作,慎重!

回滾遠程倉庫實際上就是要將遠程倉庫中的當前分支引用指向其他的commit

那思路就來了,如果我可以直接操作遠程倉庫的話,那我直接就在當前分支執行一下 reset 操作就完了。

當然了,咱不能直接操作遠程倉庫。哈哈...

那我們可不可以更新遠程倉庫的分支指向的提交呢?這個當然可以,我們每次 push 操作就是在更新遠程倉庫對應的分支呀!

那另一個思路就來了,我本地回滾一下,然後 push 上去不就行了嘛!

//本地改完以後需要強制推送到遠程
git push origin HEAD --force
//這個命令會把當前本地分支的引用強制更新到遠程

需要注意的是,要加一個 --force 參數,表示強制更新。


                         歡迎關注我的公衆號查看更多精彩文章!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章