使用 git 时会出现各种各样的问题,下面是几种情况下怎么反悔的操作
一,未加入缓存区,撤销文件修改
git checkout -- file
二,已加入缓存区,撤销文件提交
git reset HEAD file
或 git rm --cached file
三,已提交到本地,回滚提交
git reset --HARD commit_id/HEAD^n
四,已 push 到远程
1,git revert 的方式
1)git revert commit_id // 将要撤销的提交 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 的话,那本地又变成和远程一样了,是解决不了问题的。