test3

人在地球,刚下飞船發表於2024-06-05

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

步驟:先回退本地版本,再強推到遠端倉庫裡,有兩種方法

方法:

  1. reset(回滾到)
  2. 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