Git:如何撤銷已經提交的程式碼
日常操作流程
本地工作區(尚未暫存) ---> add . 到暫存區 ---> commit 到本地倉庫 ---> pull拉取關聯遠端倉庫分支合併到本地的分支---> push 到遠端分支
檢視commit提交的內容
git log #檢視commitId的log
git show #檢視最新的commit
git show commitId #檢視指定commit c440aa10ac的所有修改:
場景一:
修改的檔案已被git commit,再次修改的檔案,合併到上一次提交的commit中,不再產生新的Commit
# 修改最後一次提交
git add sample.txt #修改檔案新增到暫存區
git commit --amend -m"說明" #合併提交到上一次的commit裡
git commit --amend #或者 進入到編輯裡編寫提交註釋
修改上一次commit提交的備註
git commit --amend
場景二:
當修改檔案後,還沒有add提交到暫存區,也沒有commit時,想要放棄修改
git checkout 11.txt #放棄11.txt檔案的修改
git checkout . # 放棄所有檔案的修改
git checkout – . 丟棄全部,也包括:新增的檔案會被刪除、刪除的檔案會恢復回來、修改的檔案會回去。這幾個前提都說的是,回到暫存區之前的樣子。對之前儲存在暫存區裡的程式碼不會有任何影響。對commit提交到本地分支的程式碼就更沒影響了。當然,如果你之前壓根都沒有暫存或commit,那就是回到你上次pull下來的樣子了。
場景三:
當檔案add提交到暫存區,還沒有commit時,發現檔案提交錯了,這時想撤回檔案
git reset HEAD a.php #只撤消a.php
git reset HEAD * #撤消所有
這個命令僅改變暫存區,並不改變工作區,這意味著在無任何其他操作的情況下,工作區中的實際檔案同該命令執行之前無任何變化
場景四:
當檔案add提交到暫存區,也commit了,發現檔案提交錯了,這時想撤回檔案
git reset HEAD^ # 撤消上一次的commit 不帶引數預設是--mixed 例:git reset --mixed HEAD^ 也可以寫成git reset HEAD~1
git reset HEAD~2 如果你進行了2次commit,想都撤回,可以使用HEAD~2
git reset fdaeaf208f0e142ceba5766d17786d60fcebc1dd #撤消指定的commitId
git reset --hard fdaeaf208f0e1 # 回退到指定版本 放棄工作區的所有修改,還原到指定版本的程式碼
reset三種模式區別
--soft:不刪除工作空間改動程式碼,撤銷commit,不撤銷git add .操作,重置位置的同時,保留working Tree工作目錄和index暫存區的內容,只讓repository中的內容和 reset 目標節點保持一致,因此原節點和reset節點之間的【差異變更集】會放入index暫存區中(Staged files)。所以效果看起來就是工作目錄的內容不變,暫存區原有的內容也不變,只是原節點和Reset節點之間的所有差異都會放到暫存區中。
--mixed(預設):不刪除工作空間改動程式碼,撤銷commit,並且撤銷git add . 操作,重置位置的同時,只保留Working Tree工作目錄的內容,但會將 Index暫存區 和 Repository 中的內容更改和reset目標節點一致,因此原節點和Reset節點之間的【差異變更集】會放入Working Tree工作目錄中。所以效果看起來就是原節點和Reset節點之間的所有差異都會放到工作目錄中。
--hard:刪除工作空間改動程式碼,撤銷commit,撤銷git add . 操作,重置位置的同時,直接將 working Tree工作目錄、 index 暫存區及 repository 都重置成目標Reset節點的內容,所以效果看起來等同於清空暫存區和工作區。
注意完成這個操作後,就恢復到了指定版本的commit狀態。
push到遠端倉庫
如果程式碼之前已經push到遠端倉庫裡,想要撤消線上的push
步驟:先回退本地版本,再強推到遠端倉庫裡,有兩種方法
方法:
- reset(回滾到)
- revert(重做)
區別:
- reset是指將HEAD指標指到先前已存在的歷史提交,歷史記錄中不會出現放棄的提交記錄。
- revert是放棄指定提交的修改,但是會生成一次新的提交,需要填寫提交註釋,以前的歷史記錄都在;
reset(回滾到)
git reset --hard fdaeaf208f0e1 # 回退到指定版本 放棄工作區的所有修改,還原到指定版本的程式碼
git push 目標分支 本地分支 -f
此時如果用“git push”會報錯,因為我們本地庫HEAD指向的版本比遠端庫的要舊,要加-f引數強制推送
#git push 目標分支 本地分支 -f
git push origin master -f
revert(重做)
參考下面的文件:
https://www.cnblogs.com/birdy-silhouette/p/13958151.html
或者在IDEA中操作:
選soft 或者 mixed 都可以,這個你本地開發的程式碼不會丟失。
檢視程式碼已經撤回了
4.git push 重新提交會報錯;
把撤回的狀態推送到線上倉庫裡,因為此時只是在本地撤回程式碼了,還沒有同步到線上
這是因為撤回後,本地倉庫裡的版本小到線上倉庫的,所以被拒絕
下面強推一下就可以了
git push origin master -f
5.使用git push --force
執行完上面的命令後,線上倉庫裡的提交就被撤回了。
然後,自己在本地再修改程式碼,測試好了,再重提交程式碼
add .
add commit -m"edit code"
add pull
add push