看到一篇写的非常不错的文章,图文并茂地介绍了git reset三种模式:文章连接
简单总结下,reset 就是撤销从指定commit_id之后的所有提交。区别是:
- –hard:working tree和cache全部清空。
- –soft:未提交修改和撤销commit的修改,保留。撤销commit的修改,放在cache区里。
- –mixed(不加参数):未提交修改和撤销commit的修改,保留。撤销commit的修改,以及为提交cache里的修改,放在working tree里。
总结:–mixed和–soft都能保留修改,但是–soft会将撤销的放在cache里。所以如果想要保留修改,就用–soft;不想保留修改,就用–hard。
这里以commit_id为例,如果是一个文件,就只是对该文件进行reset,head不移动。
如果reset导致head移动了,需要push –f 强制推送修改,因为他们的commit不匹配了,而这将导致reset之后的commit都丢失了。
git reset [- -mixed] commit_id
将head指向commmit_id,并将index里的文件替换为commit_id对应的状态。
git reset – -soft commit_id
仅将head指向commit_id。此时index仍然指向之前的commit,所以index里面有很多diff文件。workspace里修改的文件还在。
git reset – -hard commit_id
head指向commit_id,index文件是commit_id状态,同时workspace里的文件也被重置为commit_id的状态。