Git - 如何撤銷上一次commit操作


第一種情況:還沒有push,只是在本地commit

1.語法說明

git reset [--soft | --mixed | --hard] [HEAD]

--mixed 為默認,可以不用帶該參數,用於重置暫存區的文件與上一次的提交(commit)保持一致,工作區文件內容保持不變

git reset  [HEAD]

--soft 參數用於回退到某個版本:

$ git reset --soft HEAD^ # 回退所有內容到上一個版本  $ git reset --soft HEAD^ hello.php # 回退 hello.php 文件的版本到上一個版本  
$ git reset
--soft 052e # 回退到指定版本

HEAD 說明:

  • HEAD 表示當前版本

  • HEAD^ 上一個版本

  • HEAD^^ 上上一個版本

  • HEAD^^^ 上上上一個版本

  • 以此類推...

 

可以使用 ~數字表示

  • HEAD~0 表示當前版本

  • HEAD~1 上一個版本

  • HEAD^2 上上一個版本

  • HEAD^3 上上上一個版本

  • 以此類推...

 

--soft 參數: 注意!!! 謹慎使用 –hard 參數,它會刪除回退點之前的所有信息

 

2.真實案例

在本地commit后,一直push不上去:

  • remote: GL-HOOK-ERR:ERROR: author:“019124”, 格式非法, 應當是你的工號,以K/S/0開頭.        
  • remote: GL-HOOK-ERR:ERROR: 請重新設置[user]下的name值.

 

 

原因是因為,已經提交的log中顯示的author不符合規則:

可以通過git log查看

 

 

然后使用以下命令,回退到上一個版本。

$ git reset --soft HEAD~1

可以看到,author為“019124”的記錄消失了。這時候就能重新以新author身份重新提交。

 

 

 

第二種情況:commit push 代碼已經更新到遠程倉庫

對於已經把代碼push到線上倉庫,你回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,線上,線下代碼保持一致.你要用到下面的命令:

git revert <commit_id>

revert 之后你的本地代碼會回滾到指定的歷史版本,這時你再 git push 既可以把線上的代碼更新。

 

兩種情況對比

注意:git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit,看似達到的效果是一樣的,其實完全不同。

第一:上面我們說的如果你已經push到線上代碼庫, reset 刪除指定commit以后,你git push可能導致一大堆沖突.但是revert 並不會.
第二:如果在日后現有分支和歷史分支需要合並的時候,reset 恢復部分的代碼依然會出現在歷史分支里.但是revert 方向提交的commit 並不會出現在歷史分支里.
第三:reset 是在正常的commit歷史中,刪除了指定的commit,這時 HEAD 是向后移動了,而 revert 是在正常的commit歷史中再commit一次,只不過是反向提交,他的 HEAD 是一直向前的.

 

參考文獻

git reset 命令: https://www.runoob.com/git/git-reset.html 

git 取消commit:https://www.cnblogs.com/lyy-2016/p/6509707.html


免責聲明!

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



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