第一種情況:還沒有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