掌握 git reset 使用

logo
通常我们提交代码一般都是 git add ,git commit -m, git push 的这么个流程。添加到暂存区,提交到 git 库生成版本号,push 到远程仓库以供他人可以使用。这是一个完整的且非常顺利的流程。但是往往实际开发中并不是这么顺利,总会出现这样或那样的问题。

git reset 就是当我们提交了错误的内容后进行回退使用的命令。git reset + 版本号,就是回退到该版本号上。

通常我们使用 git reset HEAD 就是回退到当前版本。git reset HEAD^ 回退到上一版本。

如我们 git add 一个文件这时我们发现添加了错误的内容,此时我们只是做了add 操作,就是将修改了内容添加到了暂存区,还没有执行commit,所以还没有生成版本号,也没有当前的版本号对应的内容,所以我们只需要将代码回退到当前版本就行。

git reset HEAD 可以理解就是去除掉添加到暂存区的内容。

以上的场景是 add 后还没有 commit 的,下面我们看一下已经 add 并且 commit 之后的该如何回退。

如果我们已经 commit 了,还没有 push,push的内容我们先不管,push 这个命令其实和提交没关系,他只是推送到远程了,如果 push 了,也就是我们回退了之后,再重新 push 一下而已,所以请不要纠结 push 这个操作。他和提交版本其实没有关系的。

回归话题。我们已经 commit 了,说明已经生成了最新的版本号了,此时我们想回退,则肯定是回退到之前的一个版本了,如果你知道前一个版本的版本号,git reset + 版本号,这样就可以了,但是一般我们不会去记版本号的,当然你可以执行 git log 命令去查到。git 为我们提供了一个更简单的回退上一个版本的方法 git reset HEAD^。

此命令专门用于回退到上一个版本,如果你的错误路程已经走的很远了,仅仅回退上一个版本可能也解决不了了,那就需要查找日志,找到对应的版本号进行 git reset + 版本号,进行回退了。

如果你中间部分的提交代码出错了,比如考虑这个例子,我们提交了 6 个版本,其中 3 包含了错误的代码需要被回滚掉。 同时希望不影响到代码的第 1,2,4,5,6 次提交。

使用 git revert + 版本号,可以撤销指定的提交,这样就可以撤销中间部分提交的错误代码了。注意单词一个是 reset 一个是 revert ,不要搞混淆了哦。

这里再提一下特殊情况,如果你使用 git reset HEAD^ 回退上一个版本,此时发现我又不应该回退,认为这次操作是个错误的选择,那么我们可以再执行一次这个命令,代码又回来了,这个就是特殊情况了。

还有一个类似的 git reset --hard HEAD 命令,注意这里加了个 --hard 参数。

注意,这里和没有 --hard 是有区别的啦,有了参数 --hard ,直接把工作区的内容也修改了,不加 --hard 的时候只是操作了暂存区,不影响工作区的。

同层使用这个命令清除代码,当我们实验一种思路,或者跟朋友讲代码时,我们可能会随意的修改代码。而当我们回到正常的开发时,我们需要一个干净的工作目录,即保证目前工作目录跟Git最后一次 commit 的文件是一致的。我们可以这么做。

如果你的代码没有添加到暂存区,只是在工作区中修改,可以使用 git checkout . 放弃所有的文件修改。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。如果手动删除麻烦,那么没关系,可以使用 git clean -df 命令,删除当前目录下没有被 track 过的文件和文件夹。

git clean 经常和 git reset --hard 一起结合使用,记住 reset 只影响被 track 过的文件, 所以需要 clean 来删除没有 track 过的文件,结合使用这两个命令能让你的工作目录完全回到一个指定的 commit 的状态。

上面两个命令都会清除工作区里面的内容,但是清除之后没法还原,尽量少用会丢失文件的操作,除非你能够确定不再需要这些文件。其实我们可以把代码暂存起来,然后在下次需要的时候可以恢复。

git stash 会把所有未提交的修改都保存起来,用于后续恢复当前工作目录。通过 git stash 命令推送一个新的储藏,当前的工作目录就干净了。重新应用缓存的 stash 可以通过 git stash pop 命令恢复之前缓存的工作目录。

猜你喜欢

转载自blog.csdn.net/wu_xianqiang/article/details/108171952