git checkout 和git reset在回滚方面的区别

893 阅读1分钟

这两个命令都可以对项目的回滚操作。
回滚:即将当前的HEAD指针指向的commitId和文件改回到某个commitId及对应的文件状态。

先说下怎么使用
git reset --hard [commitId];
git checkout [commitId] [--] [file path];

不同点:

1. reset会带着HEAD指针以及指针指向的当前分支,指向目标commitId或者分支引用;checkout只会移动HEAD指针,当前分支的引用不改变。

2. checkout是将项目或者文件的状态直接改成commitId对应的状态,此时执行git status,会发现文件状态会变成modified。即文件状态已经被改变,需要重新git add,commit操作,生成一个新的commitId。


顺便说下reset --hard回滚之后,如何回到回滚之前的commitId

上面提到过reset --hard会将HEAD指向当前的commtId,这恶搞commId之后的id就会丢失,那如果想回到回滚之前的commtId,怎么操作呢?其实,只要之前的id并没有真正丢失,我们只要通过找到之前的id,就可以再次执行git reset --hard操作回到之前的id状态。

git reflog会列举出所有操作的流水记录,包括reset操作。那么此时我们通过这个记录找到reset之前的id,就可以重新返回了。


git reset 的三个参数:mixed/soft/hard;
soft:只移动HEAD指针的引用。
mixed(默认):移动HEAD指针的引用,使暂存区的内容和指定commidId位置的内容一致。一般用作撤销add操作(git reset HEAD)。
hard: 移动HEAD指针的引用;将暂存区和工作区的内容更改为指定commitId的状态。