1. 神器:不懂的用法直接githelp cmd。cmd为你想查看的命令。
2. 从仓库中拉出所有文件
简单理解,等同于不小心把文件全部删除了,只剩下仓库。简单地执行gitreset –hard即可;
3. git reset的三种模式
要理解reset的模式,先明确git的提交流程:
1. 修改工作树
2. git add,对当前修改生成快照
3. git commit,提交当前的修改。
当然,通常情况下,可以用git commit -a,相当于同时做第2、3步。
--soft:不修改工作树中的文件和仓库索引,保留了add生成的快照,只是退回了commit的过程(相当于退回到commit前,add后);
--mixed:不修改工作树,修改了仓库索引,不保留快照,相当于退回了commit和add两个过程;
--hard:修改工作树,相当于所有东西,包括工作树和仓库,原原本本地退回到指定的<commit>
4. git回退版本——恢复所有文件
由于git 没有svn方便的update to revision功能,所以只能另寻替代功能了。
如果你要干干净净地回到之前某个版本,在此之后的所有提交都不需要保留。那么简单地进行reset即可:
$ git reset --hard <commit>
或
$ git checkout <commit>
<commit>为你要退回的版本号。但是如果你只是想回去查看一下以前的代码,看完后需要回到最新的HEAD上来,有两种方法:一是reset前先记住当前HEAD的commit号,用gitcheckout命令时也会有提示当前HEAD号的功能。当然这样做有风险,万一忘了HEAD号退不回去了,那就万事over了;二是gitreset前先建一个新的branch,在新branch上随便你折腾,最后删除这个不用的branch即可;推荐用二。
5. git回退版本——恢复单个文件
因为gitreset在带--hard的情况下不能加目录名,所以此时只能是gitcheckout派上用场了。
丢弃当前所有更改,回到HEAD的版本:
$ git checkout <path>
回到之前的某个版本
$ git checkout <commit> <path>
注意:此时对应文件已被更改,但是已处于被add的状态,所以用gitdiff是看不到其与当前HEAD上对应文件的区别的,除非用gitdiff --cache或执行:
$ git reset
这种方法不仅可以回到当前branch的某次提交,也可以将非当前branch的某次提交的文件checkout出来,如:
$ git checkout otherbranch~0 log.txt
~后的数字n表示对应branch的HEAD之前的第n次提交。