git各種狀態下撤銷修改的方法
使用git時會出現各種各樣的問題,下面是幾種情況下怎麼反悔的操作
一,未加入快取區,撤銷檔案修改
git checkout -- file
二,已加入快取區,撤銷檔案提交
git reset HEAD file
三,已提交到本地,回滾提交
git reset --HARD commit_id/HEAD^n
四,已push到遠端
1,git revert的方式
1)git revert commit_id //將要撤銷的提交revert出一次新的提交,這樣上次的改動就被抵消了,但本地分支也比遠端分支多一個revert提交
2)git push origin master //推送到遠端
這種方式是最方便的,但缺點是多了2次無用的commit,使整個分支的commit不再整潔。
2,如果遠端倉庫不是使用git init --bare建立的裸倉庫(裸倉庫無法回滾提交),而是一個普通倉庫(通過git init建立),那麼你可以登入到遠端伺服器,然後在服務上回滾提交,然後再把原生代碼回滾。
但這種方式會影響其他使用該中央倉庫的人,最好是他們也能做原生代碼回滾。
3,可刪除遠端分支,然後回滾本地分支,然後將本地分支push到origin
1)git branch xxx_backup //建立備份分支
2)git push origin xxx_backup:xxx_backup //將備份分支推送到origin
3)git checkout xxx //切回要撤銷修改的分支
4)git reset --hard commit_id //撤銷本地commit
5)git push origin :xxx //刪除遠端xxx分支
6)git push origin xxx:xxx //將本地撤銷修改後的xxx分支推送到origin
7)git branch -d xxx_backup //刪除本地備份分支
git push origin :xxx_backup //刪除遠端備份分支
上述步驟5執行時可能會出現錯誤,如下:
尤其是遠端倉庫是在github或oschina上時,因為這些網站中將某分支設定成了當前分支,而刪除當前分支是不允許的,所以要在這些網站的設定中切換當前分支為其它分支,然後再此執行步驟5.
4,方法3中,如果是自己建立的倉庫,預設分支是master,我沒找到修改預設分支的辦法,master分支也就無法刪除,方法4也就沒用了。但有另一種方法可以解決問題
1)登入伺服器,備份中央倉庫
mv demo.git demo_backup.git
2)新建一個空的demo.git
git init --bare demo.git
3)通過回滾,修復本地提交到正常狀態
git reset --hard 提交id
4)推送本地的master分支到伺服器的demo.git
git push remote master:master
這樣的做法,可以儲存之前的提交記錄,是比較好的修復方式;這種方法比較適合修復出現程式碼覆蓋的情況
如果中間出現問題,請通過demo_backup.git找回中央倉庫
錯誤的做法
1,直接reset本地提交,然後push到origin
這種做法是錯誤的,git會報錯,原因是遠端倉庫中該分支比本地分支多n次commit,只能先pull,再push。而如果先pull的話,那本地又變成和遠端一樣了,是解決不了問題的。