[轉]Git 代碼撤銷、回滾到任意版本(當誤提代碼到本地或master分支時)


兩種情況(場景)

 


 

情況一  
    代碼還只在本地,未push到運程倉庫,想把代碼還原到上一次commit的代碼,此時操作為代碼撤銷

解決方案:

1
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]

情況二
    代碼已經push到運程倉庫,想把代碼還原到上一次提交,此時操作為代碼回滾

解決方案:

1)查看git提交日志,找到上次提交的信息,輸入命令 git log (查看全部日志)或 git log -xx(查看最近xx條日志)

復制代碼
$ git log -3

commit 4dc08bb8996a6ee02f
Author: Mark <xxx@xx.com>
Date:   Wed Sep 7 08:08:53 2016 +0800

    xxxxx

commit 9cac9ba76574da2167
Author: xxx<xx@qq.com>
Date:   Tue Sep 6 22:18:59 2016 +0800

    improved the requst

commit e377f60e28c8b84158
Author: xxx<xxx@qq.com>
Date:   Tue Sep 6 14:42:44 2016 +0800

    changed the password from empty to max123
復制代碼

 

 可以看到,我標紅的就是commit的ID標識,所以為了更好區分你每次代碼提交標識,建議每次提交時給到Tag(提交信息)。

 

2)回滾到指定的版本(hard后面接的是上面標紅的ID,也就是想回滾到的版本)

1
2
3
4
5
## 回退到指定版本,不保留原更改代碼
git reset --hard e377f60e28c8b84158
 
## 回退到指定版本,保留原更改代碼,且生成新的提交
git revert e377f60e28c8b84158     

  

 

3)強制提交(這個時候已經將代碼回退了,你現在的分支狀態就處於你上一步指向的版本)

 

1
git push -f origin master

4)如果你只是誤提了代碼,想保留代碼改動的話,那就在2)的時候使用revert 命令,而不是reset,兩者區別如下:

  • revert 是放棄指定提交的修改,但是會生成一次新的提交,需要填寫提交注釋,以前的歷史記錄都在;
  • reset是指將HEAD指針指到指定提交,歷史記錄中不會出現放棄的提交記錄。

關於對Git中reset詳解,可以參考:https://www.jianshu.com/p/12803dba313e

 


 

補充場景:誤將其他分支代碼合到自己分支且代碼已提交到遠端

 

思路

     先將代碼回滾到上一次提交,這樣原本提交到遠端的代碼就會被撤銷並在本地重新生成一次提交,接着將想提交的代碼修改完后,暫存到本地存起來,接着切換到主分支將主分支代碼拉下來保持其代碼一致,隨后刪除掉原本提交代碼的分支,重新新建一個分支,接着將原本暫存的代碼拿出來,提交到新分支上,結束!  

解決步驟

1
2
3
4
5
6
7
8
9
10
git status                    查看當前分支狀態
git  log                        查看提交歷史
git reset  ***              根據提交歷史ID回滾代碼至上一次提交(參考上文)
git stash                     將回滾后的代碼,暫存到本地倉庫
git checkout master        將當前分支切換至master主分支
git pull                      將master的代碼拉至本地,保持當前代碼是正式環境運行代碼
git branch -d ***(原本提交代碼的分支名)  刪除本地原分支
git checkout -b ***          新建一個新的分支且切到分支上
git stash pop                將暫存至本地倉庫的代碼取出來
git push --force             將代碼強制發布


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM