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 add
andgit commit -m
或git 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_id2
、commit_id3
和commit_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...