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的话,那本地又变成和远程一样了,是解决不了问题的。

你可能感兴趣的:(git)