Git撤回已經推送(push)至遠程倉庫提交(commit)的版本


背景

所以,經常會遇到已經提交遠程倉庫,但是又不是我想要的版本,要撤下來。

 

回退版本一般使用git reset,又分為:

# 不刪除工作空間改動代碼,撤銷commit,不撤銷git add . 
git reset --soft xxx---版本號---xxxx  

# 刪除工作空間改動代碼,撤銷commit,撤銷git add . 注意完成這個操作后,就恢復到了上一次的commit狀態。
git reset --hard xxx---版本號---xxxx  

  

兩種。

可以用git reset --soft HEAD~1(git reset --hard HEAD~1), 用來表示上一個版本,因為上一版本其實就是當前-1。git reset --soft HEAD~1 也可寫成 git reset --soft HEAD^  。

也可以用git reset HEAD 表示當前版本,運行后並不會有什么變化,因為HEAD就是當前。

 

 

說這兩者區別前,我們首先要明白一個東西,commits。

它在git中扮演了一個重要角色,我們平常用的一些操作git clone ,git commit 都會產生commits,通俗的講這個就是版本號。

但是git reset並不會產生commits(不是不會產生,而是會產生 但是都是一樣的),我們可以先看看自己項目中的commits,使用如下命令:git reflog

前面那一串數字就是commits。而git reset可以看成不產生commits,它只是改變了當前HEAD指向的commits。

git reset --soft 表示只是改變了HEAD的指向,本地代碼不會變化,我們使用git status依然可以看到,同時也可以git commit提交。

git reset --hard后者直接回改變本地源碼,不僅僅指向變化了,代碼也回到了那個版本時的代碼,所以使用是一定要小心,想清楚

 

 

備注:

如果commit注釋寫錯了,只是想改一下注釋,只需要,git commit --amend,此時會進入默認vim編輯器,修改注釋完畢后保存就好了。

 

解決方案1

注意這個git  reflog 列表是逆序排列的,最上面的最新的commit。

git reset --hard HEAD~1后,最后一個(HEAD->master),將一直往下走,並進一步接近 

以上圖所示的狀態時,如果再來兩次 git reset --hard HEAD~1, 將回到初次提交后的狀態。

 

之后,使用git status ,可發現此時還在緩存區中的代碼,其含義是,第一次初始化提交后 ,進行了之后的add后新加入的文件 。

注意這種操作是本地的倉庫操作,如果你連續commit了很多次,而這些commit還沒有來得及提交遠程倉庫。此時如果想回到上次本地commit的話,也可以如上操作。再push,便可達到目的。

這時候就好辦了,我們選擇很多,可以直接修改代碼,再commit,也可以取消git add 命令, 如:

git rm -f --cached .idea/*

 

解決方案2 (推薦)

首先,通過git log查看提交信息,以便獲取需要回退至的版本號。

 然后,通過git reset –soft <版本號>重置至指定版本的提交,達到撤銷提交。

$ git reset --soft  85dee0d8b108c7450e0c820b2d72928f98d94f93

參數soft指的是:保留當前工作區,以便重新提交 。
還可以選擇參數hard,會撤銷相應工作區的修改,一定要謹慎使用。

 

通過git push origin master –force強制提交當前版本號,以達到撤銷倉庫遠程版本號的目的。

Cheetah@xxx MINGW64 /e/Projs/enft/data/cv_key_frame (master)
$  git push origin master -f
Total 0 (delta 0), reused 0 (delta 0)
To github.com:AnthonyGIS/video_frame.git
 + c63650a...85dee0d master -> master (forced update)

Cheetah@xxx MINGW64 /e/Projs/enft/data/cv_key_frame (master)

  

最后,修改代碼,重新提交和推送。

//修改代碼,添加修改
git add .
//重新提交
git commit -m "xxx"
//重新推送
git push origin master

 

 

參考文章

Git撤銷已經推送(push)至遠端倉庫的提交(commit)信息

git push提交成功后如何撤銷回退

git commit之后,想撤銷commit

 

 


免責聲明!

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



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