前沿知识:
Git在管理修改时在本地可以分为三个区域:
1. 工作区(working tree)
2. 暂存区(index)
3. 版本库(tree-ish)
其中工作区就是我们日常编辑代码的区域,git记录工作区的所有修改。
我们使用了git add 就将工作区的修改提交到了暂存区中。
我们使用了git commit就将暂存区中的内容全部提交到了版本库中,此时版本库中增加了一个最新的版本,HEAD指向该版本。
git push将当前版本库中对应分支的最新版本提交到远端。
可以看出我一共commit了4次:
(1)Initial commit(这一次是在GitHub上创建repo的时候自动提交的)。
(2)add student.
(3)add AnHui.
(4)add age.
我们当前的版本就是HEAD指向的版本,上一个版本就是HEAD^ ,上上个版本就是HEAD^^ ,上100个版本就是HEAD~100。OK,我们现在使用:
git reset --hard HEAD^
如果这时我又想回到之前的**add age**的commit版本也是可以的,前提是你得记得它的commit id。因为这时我们使用**git log**查看的时候发现**add age**的commit已经没有了,取而代之的是HEAD指向**add AnHui**的commit!!
如果这时我又想回到之前的**add age**的commit版本也是可以的,前提是你得记得它的commit id。因为这时我们使用**git log**查看的时候发现**add age**的commit已经没有了,取而代之的是HEAD指向**add AnHui**的commit!!
我在命令行窗口中向上翻,查到add age的commit id,键入命令
git reset --hard f913a5
即可。
注意:commit id不需要全部输入,只需要输入前几个字符即可。
果然又穿梭成功了:
注:如果无法在命令行窗口找到add age的commit id,使用
git reflog
可以查看每一次命令的记录:
2 撤销修改
我们接着上面的内容来,我们对info.txt进行修改,添加一行
I love programming.
此时git status:
此时修改已经产生,我们分3种情况讨论如何将刚刚的修改撤销掉。
情况1:未git add
这是最简单的情况,此时修改仅保存在工作区,还没有进入暂存区。
使用
git checkout -- info.txt
将info.txt在工作区的修改全部撤销到最近的一次git add或者git commit(如果最近没有git add的话)。
果然撤销了修改。
情况2:已经git add,但未git commit
此时修改已经被提交到了暂存区,但是还没有进入版本库中。你可以:
- 使用git reset HEAD info.txt先把info.txt在暂存区的修改撤销掉,回到工作区:
-
同上,使用git checkout -- info.txt对工作区中的修改撤销。
情况3:已经git commit
此时修改已经从暂存区被提交到了版本库中。这个时候可以使用
git reset --hard HEAD^
来强行回退到上一个版本,此时工作区的内容也回退到之前的版本。