git如何撤銷上一次commit(或已push)

git如何撤銷上一次commit操作

Git有三大區(工作區、暫存區、版本庫)以及幾個狀態(untracked、unstaged、uncommited),Git 保存的不是文件的變化或者差異,而是一系列不同時刻的文件快照。

1.第一種情況:還沒有push,只是在本地commit

git reset --soft|--mixed|--hard <commit_id>
git push develop develop --force  (本地分支和遠程分支都是 develop)

這裏的<commit_id>就是每次commit的SHA-1,可以在log裏查看到

git log

–mixed 修改本地倉庫、暫存區裏面的數據爲commitId對應快照裏的數據,是git reset默認的參數,–mixed可缺省。 暫存區的數據會被快照中的數據覆蓋
–soft 修改本地倉庫裏面的數據爲commitId對應快照的數據。(僅改變指向快照的指針指向)
–hard 修改本地倉庫、暫存區、工作區裏面的數據爲commitId對應快照的內數據

當push代碼以後,又用 reset --hard <commit…> 回退代碼到某個版本之前,但是這樣會有一個問題,你線上的代碼沒有變,線上commit,index都沒有變,當你把本地代碼修改完提交的時候你會發現全是衝突…這時換下一種。

2.commit push 代碼已經更新到遠程倉庫

對於已經把代碼push到線上倉庫,你回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,線上,線下代碼保持一致,你要用到下面的命令

git revert <commit_id>

revert 之後你的本地代碼會回滾到指定的歷史版本,這時你再 git push 既可以把線上的代碼更新。
注意:git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit,看似達到的效果是一樣的,其實完全不同

區別:
第一:上面我們說的如果你已經push到線上代碼庫,reset 刪除指定commit以後,你git push可能導致一大堆衝突,但是revert 並不會。
第二:如果在日後現有分支和歷史分支需要合併的時候,reset 恢復部分的代碼依然會出現在歷史分支裏。但是revert 方向提交的commit 並不會出現在歷史分支裏。
第三:reset 是在正常的commit歷史中,刪除了指定的commit,這時 HEAD 是向後移動了,而 revert 是在正常的commit歷史中再commit一次,只不過是反向提交,他的 HEAD 是一直向前的。
在這裏插入圖片描述
在這裏插入圖片描述

參考鏈接:
https://www.jianshu.com/p/b735f7accb20
https://www.cnblogs.com/wuyun-blog/p/10026363.html
https://blog.csdn.net/yxlshk/article/details/79944535

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章