今天遇到一个问题,就是在git工程下修改了一些代码,结果发现搞错了,需要撤销掉所有改动的内容,还原到之前的初始版本,换言之就是放弃自己在本地所做的修改。该怎么做呢?要分以下几种情况来区别对待:
一、尚未使用“git add”缓存过代码
1、对于指定的单个文件,可以使用下面的命令放弃对它的修改:
git checkout -- filename # 比如:git checkout -- readme.md
注意:不要忘记中间的 “–” ,不写就成了检出分支了!!
2、若想放弃所有的文件修改,可以使用下面的命令:
git checkout . # 注意checkout后面有一个空格,然后带一个.号
注意:此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。
3、若想要删除新增的文件,除了手动删除外,也可以使用下面的命令:
git clean -df # 从工作目录中移除没有track的文件
4、综上,若想要彻底放弃全部修改的内容(包括新增的文件,以及对现有文件的修改),则可以一次性使用下面的命令:
git checkout . && git clean -df # 注意checkout后面有一个空格,然后带一个.号
注意:这里用到了git clean命令,这个命令主要是用来从你的工作目录中删除所有没有tracked过的文件,具体的用法,可以参见我的另外一篇博客(玩转GIT系列之【git clean的用法】)。
二、已经使用“git add”缓存了代码
1、对于指定的单个文件,可以使用下面的命令放弃对它的修改:
git reset HEAD filename # 比如:git reset HEAD readme.md
2、若想放弃所有的文件修改,可以使用下面的命令:
git reset HEAD . # 注意checkout后面有一个空格,然后带一个.号
注意:此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了(一)所示的状态。继续用(一)中的操作,就可以放弃本地的修改。
三、已经用“git commit”提交了代码
1、若想要回退到前一次commit的状态,可使用下面的命令:
git reset --hard HEAD^ # 注意HEAD后面有一个^符
注意:在windows的cmd控制台下输入上述命令时,系统有可能会提示more?,让你继续补充,多按几次回车后就报错如下:
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
这是因为cmd控制台中换行符默认是^,而不是\ ,所以它的more?的意思是问你下一行是否需要再输入,而^ 符号就被当做换行符而被git命令忽略掉了。
解决方法有如下几种:
- 加引号:git reset –hard “HEAD^” ;
- 加一个^:git reset –hard HEAD^^ ;
- 换成~:git reset –hard HEAD~ 或者 git reset –hard HEAD~1(~ 后面的数字表示回退几次提交,默认是一次);
2、若想要回退到指定的某一次commit的状态,则使用下面的命令:
git reset --hard commitid # 这里的commitid是一个代号,如下注释
注意:这里的commitid就是提交时的标签,可通过git log命令查看,如下所示:
commit 47895838a4fbe867ba9a170c6d1ea6a794095025
Author: Peng Fan <peng.fan@nxp.com>
Date: Tue Dec 27 20:19:07 2016 +0800
imx: mx6sllevk: add MAINTAINERS file
add MAINTAINERS files
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
commit d3c083a94722ab9089b6085ef9e95dd4858bc206
Author: Jaehoon Chung <jh80.chung@samsung.com>
Date: Tue Dec 27 20:08:13 2016 +0900
board: samsung: update the MAINTAINERS file
Update the maintainer from Przemyslaw and Lukasz to me.
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>