Git版本回退与切换

40 阅读3分钟

前沿知识:
Git在管理修改时在本地可以分为三个区域:
1. 工作区(working tree)
2. 暂存区(index)
3. 版本库(tree-ish)
其中工作区就是我们日常编辑代码的区域,git记录工作区的所有修改。
我们使用了git add 就将工作区的修改提交到了暂存区中。
我们使用了git commit就将暂存区中的内容全部提交到了版本库中,此时版本库中增加了一个最新的版本,HEAD指向该版本。
git push将当前版本库中对应分支的最新版本提交到远端。

v2-75a3a6c21fc8f66cb3f0c42cb724d988_r.jpg

可以看出我一共commit4次:

(1)Initial commit(这一次是在GitHub上创建repo的时候自动提交的)。

(2)add student.

(3)add AnHui.

(4)add age.

v2-8bfcc8ff43b90de3a8b8180e2b08a06f_r.jpg

我们当前的版本就是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

此时修改已经被提交到了暂存区,但是还没有进入版本库中。你可以:

  1. 使用git reset HEAD info.txt先把info.txt在暂存区的修改撤销掉,回到工作区:

  1. 同上,使用git checkout -- info.txt对工作区中的修改撤销。

情况3:已经git commit

此时修改已经从暂存区被提交到了版本库中。这个时候可以使用

git reset --hard HEAD^

来强行回退到上一个版本,此时工作区的内容也回退到之前的版本。