如何撤銷git上一次的commit(或已push)
當多人開發(fā)時,我們本地commit后,剛要push,發(fā)現(xiàn)忘記pull最新代碼,此時會有沖突push失敗,
我們想要撤銷最近的一次commit
我們先簡單介紹一下git
git有三大區(qū)【工作區(qū)、暫存區(qū)、版本庫】以及幾個狀態(tài)(untracked、unstaged、uncommited)git保存的不是文件的變化或者差異 而是一系列不同時刻的文件快照
第一種情況:還沒有push,只是在本地commit
git reset --soft|--mixed|--hard <commit_id>
commit_id需要是你想要回退的那次提交的id
可以通過 log查看
git log
–mixed 修改本地倉庫、暫存區(qū)里面的數(shù)據(jù)為commitId對應快照里的數(shù)據(jù) 是git reset默認的參數(shù) --mixed可以省略 暫存區(qū)的數(shù)據(jù)會被快照中的數(shù)據(jù)覆蓋 【回退之后,上次commit修改的代碼,沒有被暫存,但是修改還是被保存了】
– soft 修改本地倉庫里面的數(shù)據(jù)為commitId對應快照的數(shù)據(jù)(僅改變指向快照的指針指向)【回退之后,上次commit修改的代碼,依然暫存,修改的代碼保存】
–hard 修改本地倉庫、暫存區(qū)、工作區(qū)里面的數(shù)據(jù)為commitId對應快照的數(shù)據(jù)【回退之后,上次commit修改的代碼,沒有被保存】
commit push 代碼已經(jīng)更新到遠程倉庫
對于已經(jīng)把代碼push到線上倉庫 你回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,線上,線下代碼保持一致
git revert <commit_id>
revert之后你的本地代碼會回滾到指定的歷史版本 這時你在push 既可以把線上的代碼更新
注意:git revert 是用一次新的commit 來回滾之前的commit,git reset是直接刪除指定的commit 看似達到的效果是一樣的,其實完全不同
區(qū)別:
第一:上面我們說過,如果你已經(jīng)push到線上代碼庫,reset刪除指定commit后,你git push可能導致一大堆沖突,但是revert并不會
第二:如果在日后現(xiàn)有分支和歷史分支需要合并時候,reset恢復部分的代碼依然會出現(xiàn)在歷史分支里,但是revert方式提交的commit不會出現(xiàn)在歷史分支里
第三:reset是在正常的commit歷史中,刪除了指定的commit,這時HEAD是向后移動了,而revert是在正常的commit歷史中,再commit一次,只不過是反向提交,他的HEAD是一直向前的。文章來源:http://www.zghlxwxcb.cn/news/detail-590888.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-590888.html
到了這里,關于如何撤銷git上一次的commit(或已push)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!