場景:正常開發流程,我們會從master分支上拉一個新分支作為開發分支進行開發,但是在開發過程中有伙伴把測試分支合並到了開發分支,最后如果把開發分支合並回master分支的話,master分支會多了測試分支的代碼,這些代碼可能在其他開發模塊還沒上線,可能會導致生產環境出現異常,那么,如何從開發分支撤銷掉從測試分支合並過來的代碼呢?
分支如下圖
思路:如上圖,先在dev4上撤銷commit回滾到dev3上,然后把回滾的代碼放到貯存區,再撤銷dev3這個commit,並且不要dev3的代碼(因為dev3的代碼是從test分支合並過來的),這時候dev的分支回到了dev2,再把貯存區的代碼還原回來(即dev4的代碼),再作為一個新的開發分支推送到遠程分支,然后這個就是沒有了測試分支的代碼的開發分支
具體的操作驗證
1.查看日志,記錄需還原的commit版本號, git log --pretty=oneline
git log --pretty =oneline
2.撤銷已提交的commit,回滾到測試分支誤合並到開發分支的commit版本
git reset --mixed 回滾版本號
3.再次使用git log可以看到當前HEAD指向了測試分支誤合並到開發分支的commit版本
這時候我們的代碼區多了很多未暫存的文件
4.把撤銷的代碼文件暫存起來
git stash save ‘保存撤銷的代碼’
5.再撤銷當前commit並且不保留代碼(因為這里的代碼是測試分支的,我們不需要這些代碼)
git reset --hard HEAD^
6.把貯存區的代碼重新應用出來
git stash list
git stash apply stash@{0}
7.這時候千萬別pull代碼,如果pull的話,HEAD指針又會指向遠程的dev上最新的commit上,又會自動把測試分支的代碼合並回來,直接把這個分支作為新的開發分支推送到遠程倉庫即可,然后用這個分支作為開發分支開發,最后把這個分支的代碼合並回master分支,這時候就去掉了原來dev分支誤合並的測試分支代碼了,如圖
8.此時可選擇在新建分支后將代碼推送到遠程,用這個新分支代替原分支進行開發,或選擇刪除當前遠程分支把當前分支提交到遠程如下:
①刪除當前分支的遠程分支
$ git push origin :currentBranch $ //或者這么寫git push origin --delete currentBranch
②把當前分支提交到遠程
$ git push origin currentBranch
注:
1.撤銷上次的commit :HEAD~1或者HEAD^
2.git reset --mixed HEAD^
3.git reset --soft HEAD^
4.git reset --hard HEAD^
5.執行完git reset --mixed HEAD^命令后在idea可以看到已經撤銷了剛剛的commit,文件又變回未提交的藍色了
6.mixed 相當於代碼保留,撤銷git commit,同時撤銷git add,代碼回到未暫存區
7.soft相當於代碼保留,撤銷git commit ,不撤銷git add,代碼回到暫存區
8.hard不保留代碼,撤銷git commit,同時撤銷git add,回到了上一次commit的狀態
9. git relog 查看歷史操作
還有一種常見的場景,本來在開發分支進行開發,然后切換到測試環境,合並了代碼,但是這時候忘了切回開發分支,在測試分支提交了代碼,這就導致開發分支少了這次提交的代碼
處理方式一
記錄自己操作過的代碼,切換到開發分支,手動把代碼補充完整,最笨的方法
處理方式二
在測試分支撤銷掉當前提交的commit(git reset --mixed HEAD^),當然遠程的測試分支並沒有撤銷,然后切回開發分支,把剛撤銷的代碼在開發分支重新提交一次即可,最后再開發分支合並到測試分支也不會有任何問題,因為修改的代碼文件是一樣的
————————————————