Git錯誤提交後該如何回滾操作?

2021-10-09 12:00:13 字數 4119 閱讀 9196

git專案的儲存主要分為四部分:工作區、暫存區、本地倉庫、遠端倉庫

整個過程如下:

乾貨來咯!!!

現有如下提交記錄:

$ git log

commit 119f493775ac878c24c37bebda316aa73a355003 (head -> master)

author: bccoco date: tue sep 15 23:13:37 2020 +0800

第四次提交

commit 8e226045a8c501950522225c9a01337688e03e99

author: bccoco date: tue sep 15 23:13:16 2020 +0800

第三次提交

commit a2dd0e3dd5721a8e0848f98ef5a9d1be6688c0db

author: bccoco date: tue sep 15 23:12:51 2020 +0800

第二次提交

commit 6d77ae0cd6a0e934722a1d97546f9b214bd13198

author: bccoco date: tue sep 15 23:11:38 2020 +0800

第一次提交

說明:提交順序為:6d77ae-->a2dd0e-->8e2260-->119f49獲取當前提交的commit id

命令:git log或者git reflog

假設提交錯誤的commit id為commit id: 119f49這一次提交,即最後一次提交;

將某個commit id前的commit清除,並保留修改的**

命令:git reset

當前場景下就是:commit_id為第三次提交的id,即commit id: 8e2260

將指定commit_id後的所有提交都刪除,並保留修改的**在本地的區域,即workspace修改錯誤內容後將修改好的**add到暫存區,並提交到本地倉庫中

命令:git addandgit commit -mgit commit -am將最新修改後的**commit

提交後的提交記錄如下: 可以看到,我們錯誤提交的第四次commit提交記錄消失,取而代之的是我們更新**後提交的記錄第五次提交; 這樣就完成了本地的**修改和更新

$ git log

commit 323fc9b5d1d43f0b48a6bfd88b00b4ab53676ad7 (head -> master)

author: bccoco date: tue sep 15 23:39:37 2020 +0800

第五次提交

commit 8e226045a8c501950522225c9a01337688e03e99

author: bccoco date: tue sep 15 23:13:16 2020 +0800

第三次提交

commit a2dd0e3dd5721a8e0848f98ef5a9d1be6688c0db

author: bccoco date: tue sep 15 23:12:51 2020 +0800

第二次提交

commit 6d77ae0cd6a0e934722a1d97546f9b214bd13198

author: bccoco date: tue sep 15 23:11:38 2020 +0800

第一次提交

整個流程:

git log

git reset 8e2260

修改**

git commit -am '第五次提交'

接下來對git reset進行一下總結:在進行總結時,先假設有這樣乙個提交鏈:

commit_id1-->commit_id2-->commit_id3-->commit_id4

git reset commit_id1:

reset是將head重新定位到commit_id1上,對於commit_id2commit_id3commit_id4和本地當前的修改,對於不同的引數,會有不同的處理,具體如下:

reset命令有三種處理模式:

回滾commit_id前的所有提交,不刪除修改:git reset --soft commit_id

重設head,不動index,所以效果是commit_id之後的commit修改全部在index中,將id3 和 id4的修改放到index區(暫存區),也就是add後檔案存放的區域,本地當前的修改保留

回滾commit_id前的所有提交,不刪除修改:git reset commit_id等同於git reset --mixed commit_id,與 下述的git reset --hard commit_id效果不同

重設head 和 index,不重設work tree,效果就是commit_id之前的修改,全部在work tree中,為還未add的狀態,將id3 和 id4 的所有修改放到本地工作區中,本地當前的修改保留

回滾commit_id前的所有提交,將修改全部刪除:git reset --hard commit_id

重設head、index、work tree,也就是說將當前專案的狀態恢復到commit_id的狀態,其餘的全部刪除(包含commit_id後的提交和本地還未提交的修改)慎用!!

如果想要只操作修改中間的乙個commit,不對其他的commit產生影響; 也就是類似於我們只修改commit_id2,而對commit_id3 和 commit_id4無影響,該怎麼處理呢? 在專案開發中,突然發現在前幾次的提交中,有一次提交中包含乙個bug; 當然我們可以進行乙個新的修改,然後再提交一次; 但是歷史看著不美觀,我們可以直接重做有bug的commit。

為什麼不直接去再新增乙個commit呢? git revert是用於「反做」某乙個版本,以達到撤銷該版本的修改的目的。

比如,我們commit了三個版本(版本

一、版本二、 版本三),突然發現版本二不行(如:有bug),想要撤銷版本二,但又不想影響撤銷版本三的提交,就可以用 git revert 命令來反做版本二,生成新的版本四,這個版本四里會保留版本三的東西,但撤銷了版本二的東西;

在revert命令中常用的就兩個:

重做commit_id的提交資訊,生成為乙個新的new_commit_id:git revert -e commit_id

重做commit_id的提交:git revert -n commit_id

將commit_id中修改,放到index區,我們可以對他重新做修改並重新提交

git checkout回滾指定檔案的修改

命令:git checkout --

作用:將file_name的本地工作區的修改全部撤銷

有兩種情況:

總之,就是讓指定的檔案回滾到最近的一次git add 或者 git commit時的狀態!

git checkout的其他作用:

oracle提交後如何回滾

execute執行後 可以回滾 commit提交後 閃回恢復原來的資料 其實oracle提交資料是分兩步操作的,第一步execute執行,第二步commit提交。對應的pl sql也是要先點execute執行,執行後再點commit提交。但是 commit提交後 可以用閃回查詢恢復原來的資料 因為o...

Git 回滾操作

git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit git log 查詢回滾版本唯一commit標識 git reset hard head 3 會將最新的3次提交全部重置,就像沒有提交過一樣。mixed git reset 會保留原...

git 回滾操作

情況一 檔案被修改了,但未執行git add操作 working tree內撤銷 git checkout filename git checkout 情況二 同時對多個檔案執行了git add操作,但本次只想提交其中一部分檔案 git add git status 取消暫存 git reset h...