本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點git
這種狀況有多是在 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對象,而且存入了Git倉庫中,存入了就不能被刪除了。spa
那撤銷commit 本質是什麼?code
以前咱們已經學習過,commit的過程就是根據暫存區的內容,建立一個 commit 對象存入Git倉庫,同時這個commit 對象保存了上一個 commit 對象的信息,這樣就有了提交歷史記錄,與此同時更新當前分支指向新的commit。orm
撤銷commit 本質上就是將分支指向上一個commit。
只不過有個問題,暫存區中的內容和工做區中的內容要不要跟着改呢?Git可讓咱們本身選——分別對應reset
的3個參數:mixed、soft和hard
//回滾到上一次提交
git reset --hard HEAD^
//或者
git reset HEAD^ --hard
複製代碼
PS:若是隻是想修改剛剛commit時寫的提交備註,不用 reset
,能夠用下面的命令:
//修改最新一次提交的說明信息
git commit --amend -m 新的說明信息
複製代碼
首先,這是回滾公共倉庫中的代碼操做,慎重!
回滾遠程倉庫實際上就是要將遠程倉庫中的當前分支引用指向其餘的commit。
那思路就來了,若是我能夠直接操做遠程倉庫的話,那我直接就在當前分支執行一下 reset
操做就完了。
固然了,咱不能直接操做遠程倉庫。哈哈...
那咱們可不能夠更新遠程倉庫的分支指向的提交呢?這個固然能夠,咱們每次 push
操做就是在更新遠程倉庫對應的分支呀!
那另外一個思路就來了,我本地回滾一下,而後 push
上去不就好了嘛!
//本地改完之後須要強制推送到遠程
git push origin HEAD --force
//這個命令會把當前本地分支的引用強制更新到遠程
複製代碼
須要注意的是,要加一個 --force
參數,表示強制更新。
歡迎關注個人公衆號查看更多精彩文章!
複製代碼