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

本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點git

Git系列

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

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

撤銷add

這種狀況有多是在 git add 操做的時候一些沒必要要的文件也加進來了,因此想撤銷,從新 add數據庫

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

因爲添加的文件內容已經添加到Git數據庫中了,無法刪除,因此咱們不用管Git數據庫中的。咱們能夠刪除暫存區中的文件,以確保不會出如今提交記錄中。(那我要是這個文件就是一直不須要提交的,那Git數據庫中一直存在着?)微信

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

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

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

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

撤銷commit

一樣的,執行了commit 命令之後,就已經建立了 commit對象,而且存入了Git倉庫中,存入了就不能被刪除了。spa

那撤銷commit 本質是什麼?code

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

撤銷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 參數,表示強制更新。


歡迎關注個人公衆號查看更多精彩文章!
複製代碼

AntDream
相關文章
相關標籤/搜索