今天不小心把兩個不該提交的文件合着其他正常提交的文件一起提交並立即推送了,回滾版本的過程中遇到一些小坑,在此記錄。
git reset 回滾到某個版本(適用於錯誤代碼僅本地提交,還沒有推送到遠端),對應sourcetree的操作為“重置當前分支到此次提交“
git revert 回滾某個版本(反向提交,適用於已經把錯誤代碼推送到遠端),對應sourcetree的操作為“回滾提交”
1.如果已經不小心推送到了遠端,恢復步驟如下(注意:這種情況不能直接revert,否則正確的需要被提交的代碼也會丟失):
(1)reset到提交之前的版本(丟棄本地更改),把兩個誤提文件的原先版本拷貝下來
(2)回到最新版本,用拷貝的代碼手動覆蓋這兩個誤提交的文件到原先版本,然后重新提交
如果直接使用命令行操作,也可以借助reset指令,向遠端強制提交,參考博文 https://blog.csdn.net/Java_HuiLong/article/details/86144055?utm_medium=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.wap_blog_relevant_pic&depth_1-utm_source=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.wap_blog_relevant_pic
sourcetree如何強制回滾到某個版本?
1.sourcetree默認不允許強制推送,先要進行設置。
2.選擇某個分支,重置當前分支到此次提交,選擇hard模式,強行合並
3.強制推送,覆蓋遠端分支。
2.如果沒有推送到遠端,恢復步驟如下:
(1)reset到提交之前的版本(合並本地更改),重新提交即可
3.如果不像我今天遇到的這么復雜(既提交了正確的代碼,也提交了錯誤的代碼),而是只僅僅提交了錯誤的代碼,分兩種情況討論:
1.已經推送遠端 -> git revert(回滾提交)
2.沒有推送遠端 -> git reset(合並本地更改),重新提交
4.我今天遇到的這種有一部分文件不需要提交的情況,最正確的處理方式應該是:
(1)把需要提交的代碼正常提交,留下不准備提交的代碼
(2)把不准備提交,但是自己有用的代碼貯藏下來
(3)下次要用的時候,從貯藏中恢復,用完之后繼續貯藏,等待循環使用
tips:
記一篇關於git revert的暫時不太相信,感覺不可思議的文章,關於merge commit的revert事項 https://segmentfault.com/a/1190000012897697
今天又遇到一個需要版本回退的問題(2021/3/3)
現象及原因:
idea內git插件使用遇到的異常:
(1)有一次右下角的分支標記突然從1.0.2自動切換到master,發現及時,手動切換回來了。
(2)3月2號下午提交代碼,提示需要先pull,右下角的分支標記顯示的1.0.2,但是pull的時候卻把1.0.1的分支代碼拉取下來了,並且還自動合並了,同時產生了很多沖突文件,以為是好幾天沒提交代碼導致的,所以自己沒有動過的文件選擇全部接受他人代碼(這一步導致大量文件全部變成了1.0.1版本上的代碼),然后提交了。今天定位問題,才發現提交記錄上顯示的是merge origin/V1.0.1 into V1.0.2
解決辦法:
1.強制回滾遠端代碼到昨天下午未提交前的tag
(1)注意!這一步非常重要! 先做好本地代碼備份,重新從git上面拉取一份代碼,防止第二步的強制reset讓本地已經開發出來的功能代碼丟失,下面的步驟全部是在新拉取的代碼上做操作。
(2)git reset --hard <commit id>
(3)git push origin <分支名> --force
2.手動修復本地被污染的代碼,把自己改動過的類保留下來,其他的改動全部丟棄。
改進方案:這個解決辦法其實不是最好的,因為這次是發現的及時,在錯誤提交后,其他人的后續提交不多,如果是正規的解決辦法,應該是把當次的錯誤提交進行revert。但是由於這是一次merge操作,所以直接revert的時候報錯無法進行revert,這個
現象恰恰驗證了上文提到的不太相信的那個博文,而且問題更加復雜,使用git revert - m 1 <commit id> 仍然不能正常revert,原因是存在沖突的代碼,處理起來比較復雜,需要將兩個分支的代碼全部revert才行:
1.先執行git revert - m 1 <commit id>
2.解決沖突,然后git add -A ,git commit
3.然后再執行git revert -m 2 <commit id>
4.解決沖突,然后再次執行 git add -A,git commit
參考博客:https://blog.csdn.net/u013066244/article/details/79920012