这篇是作为半个过来人的我用搜索引擎、实践经验甚至血泪总结出来的教训。要想解决这个问题,具体操作取决于你的改动在什么阶段。
情况是?
1. 我还没有add
这就很简单了,一行
git checkout -- <file>
就可以丢弃修改。要想删除untracked的文件需要用
git clean -[flag]
2. 我已经add了,但还没有commit
用
git reset HEAD <file>
丢弃已经add的修改。这时就回退到3.1中的情景了,按照3.1的操作做即可。
若想同时存储本地的修改,则用
git stash
清掉工具树并让你的git文件与HEAD
状态保持一致。
3. 我已经commit了,但还没有push
先查看自己的本地分支比远程分支提前了多少个提交,再按数量回退即可。这个时候会回退到add之前的状态。
回退操作可以有如下三种:
git reset HEAD^ //只是提前一个提交
git reset HEAD~[count] //提前count次提交
git reset [hashcode] //回退到哈希值为hashcode的提交
其中每次提交的哈希值可以通过
git reflog
查看。
4. 我已经push了
那就没办法了,返回你以前的commit再强行push
吧。
先回退自己的本地分支(方法参照3.3),再用
git push -force
把回退的本地版本强行推送至远程分支。这么做有效是有效,但用了之后一起开发的小伙伴的commit全军覆没,把我吓得瑟瑟发抖,最后还得向她连声道歉,真的是怕了。在多人合作的场合务必慎用。
关于公共的远程分支的回滚方法有篇文章讲得很好,大家可以去看看。
推荐
我也没多少用git的经验,只是之前有看过一点git相关的手册,对git的状态控制略知一二。这里推荐《精通Git》,无论是只会图形界面的简单操作的小白还是对git有一定了解的进阶学习者,这本书都很合适。另外有一款网页游戏(说游戏似乎不大合适)叫 《学习Git分支》,比较适合对git了解很少的新手。