git reset的讲解
分支游标 master
我们仔细了解一下 git 的分支管理,就可以知道,其实 git 的所有管理都是通过 commit id 实现的,我们常用的 HEAD, master 以及分支名其实都只是代表的一个 commit id 而已,只不过是为了方便我们的记忆以比较 human
的方式表示。master 以及其他的 分支名对应的 commit id都存放在 .git/refs/heads 目录下,远程分支名存放在 .git/refs/remotes 目录下。
基本的三种reset 命令
首先讲三条不同参数下 reset 的命令,然后做一下个人的总结:
git reset –hard commit-id
这条命令是最凶狠的,这条命令会将游标指向 commit-id指向的那次提交,并且暂存区也会更新到指定的那次提交时的内容,更狠的是暂存区的内容也会被覆盖。
git reset –mixed commit-id
OK,这条命令没那么厉害,仓库和暂存区指向都会改变,不过工作区的内容不会改变。这也是默认的参数,–mixed可以不写。
git reset –soft commit-id
这条命令是最弱的,只会改变仓库的游标。
我们在使用reset的时候需要很小心,因为在使用了reset命令之后,我们的游标就发生了变化,而我们使用 git log 时则找不到之前最新修改的 commit id, 即表示我们回不到最新的修改了,特别是如果使用了 –hard 参数,则真的就无力回天了。(实际上通过其他的途径也可以找到这个commit id,下面会讲到一种方法)
用 reflog 挽救错误的重置
我们在上面说过用 reset 命令会导致通过 git log命令找不到 commit-id 的问题,这里提供了一种挽救的机制(但是再次重申一下,如果是使用了–hard 参数,则丢失的修改是怎么也找不回来的,只能节哀了)reflog。
cat .git/logs/refs/heads/master (我们