@[toc] 上周的文章发了后,有小伙伴问如何在 IDEA 中进行 Git 的版本回退?

其实这个松哥之前写过文章,但是时间久远了,所以今天再和小伙伴们重新捋一捋这个话题,顺便也来聊聊如何在 IDEA 中进行 Git 的版本回退。

Git 中的撤销操作,我们可以归纳为四类:

  • 工作区的代码想撤销
  • add到暂存区的代码想撤销
  • 提交到本地仓库的代码想撤销
  • 远程仓库的代码想要撤销
  • 1. 基于命令行

    1.1 工作区的代码想撤销

    可能有一天我正在写代码,写了很久发现写错了,想恢复到一开始的状态,一个笨办法就是把刚刚写的代码一行一行的删除,不过这种方式成本太高,我们可以通过 git checkout -- <file> 命令来撤销工作区的代码修改。如下图:

    首先我们执行了 git status 命令,发现工作区是干净的,然后执行了 cat 命令,发现文件只有两行内容,然后通过 vi 编辑器向文件中添加一行,保存并退出,退出来之后又执行了 git status 命令,此时工作区的状态已经发生变化,然后我们执行了 git checkout -- git01.txt 命令,表示撤销之前的操作,让 git01.txt 恢复到之前的状态,该命令执行成功之后,我们再执行 cat 命令发现文件内容已经恢复了,此时再执行 git status ,状态也恢复了。

    1.2 add 到暂存区的代码想撤销

    如果想要撤销,但是代码已经提交到暂存区了,不用担心,也能撤销,分两个步骤:

  • 将暂存区的代码撤销到工作区
  • 将工作区的代码撤销(具体操作和 1.1 小节一致)
  • 将暂存区的代码撤销,我们可以使用 git reset HEAD 命令来实现。如下图:

    这里的代码都比较简单,核心的过程就是先执行 git reset HEAD 命令,从暂存区撤销,剩下的操作参考 1.1 小节。

    1.3 提交到本地仓库的代码想撤销

    同样的,提交到本地仓库的代码一样也可以撤销,我们可以利用 git reset --hard <版本号> 命令来实现版本回退,该命令中的版本号有几种不同的写法:

  • 可以使用 HEAD^ 来描述版本,一个 ^ 表示前一个版本,两个 ^^ 表示前两个版本,以此类推。
  • 也可以使用数字来代替 ^ ,比如说前 100 个版本可以写作 HEAD~100
  • 也可以直接写版本号,表示跳转到某一个版本处。我们每次提交成功后,都会生成一个哈希码作为版本号,所以这里我们也可以直接填版本号,哈希码很长,但是我们不用全部输入,只需要输入前面几个字符即可,就能识别出来。
  • 看下面一系列的操作:

  • 通过 git log 查看当前提交日志:
  • 通过 git reset HEAD^^ 向前回退两个版本:
  • 查看日志,发现最后一次提交的版本号是 695ce1fe ,利用 git reset --hard 695ce1fe 命令回到回退之前的状态:
  • 通过 git reset --hard HEAD~1 回到上一个版本:
  • 当然以上操作都是基于命令行的,如果你命令行操作比较熟练的话,其实命令行操作比 IDEA 上点点点要快很多。

    1.4 远程仓库撤销

    如果代码提交到远程仓库了,想要撤销,那就如 1.3 小节所讲,先在本地仓库撤销,然后 push 到远程仓库即可。

    2. 基于 IDEA

    看懂了命令行操作,再看基于 IDEA 的操作就容易多了。

    2.1 未提交就撤销

    对于第一小节的前两种撤销操作,即修改的文件还没 commit,此时想要撤销,方式很简单,点击 IDEA 右上角的撤销按钮:

    如果你修改了文件,无论有没有执行 git add 命令,只要没有 commit,都可以通过这个按钮撤销修改,点击该按钮,弹出如下提示框:

    这里会列出来所有修改但是没有 commit 的文件,想要撤销哪个文件的修改,就勾选该文件,然后点击 Rollback 按钮就完成了撤销操作。

    2.2 commit 了想撤销

    如果已经 commit 了,那么就需要先打开提交日志,点击如下按钮打开:

    也可以直接点击 IDEA 右上角的时钟图标,快速打开提交日志:

    提交日志类似下面这样:

    此时的回退就分情况了。

    首先这个撤销操作分两种:

  • Revert Commit
  • Undo Commit
  • 我们分别来看。

    2.2.1 Undo Commit

    Undo Commit 这个操作只能在最近一次提交上使用,不能在其他提交上使用,最近一次 commit 上,右键单击,如下图:

    其他的 commit 上右键单击:

    既然如此,我们就来看看最近的一次 commit 如何 Undo Commit。

    在最近一次 commit 日志上右键单击后选择 Undo Commit,如下图:

    选中后,直接点击 OK,撤销最近一次的 commit。

    这就是撤销最近一次 commit,撤销之后,本地的修改相当于变成了已 add 但是未 commit 的状态,此时我们可以继续开发新代码,然后再 commit,再 push;或者也可以像 2.1 小节介绍的那样,继续撤销操作。

    我电脑上的 IDEA 在这块操作中有个偶发性问题,就是撤销掉 commit 之后,IDEA 检测不到文件处于未提交状态,需要我把 IDEA 关掉重新打开,IDEA 就能发现文件处于未提交状态了,此时就可以按照 2.1 小节的步骤继续回退了,这块小伙伴们在试验的时候可以留意下。

    2.2.2 Revert Commit

    Revert Commit 这个操作到处都能用,不同于 Undo Commit,Revert Commit 之后,会产生一条提交记录。相当于 Revert Commit 其实也是提交,只不过提交的内容刚好相反,刚好刷掉已有内容。

    Revert Commit 操作可以用在所有的日志上,而不仅仅是刚刚提交的 commit。

    操作方式如下:

    找到需要回滚的地方,右键单击,选择 Revert Commit:

    此时会弹出来一个提交的对话框,就是一个普普通通的 commit 对话框,如下:

    commit 之后,可以看到内容已经撤销了,提交日志中也多了一条记录,如下图:

    2.3 push 了想撤销

    如果已经 push 到远程仓库了,怎么撤销?

    其实跟 2.2 小节一样,先在本地仓库撤销,撤销完成后,重新修改代码,最后再 force push 就行了,不过 force push 的时候,注意别把同事的代码给覆盖了。

    3. 小结

    好啦,今天和小伙伴们分享了 Git 中的几个撤销问题,有问题的小伙伴欢迎留言讨论呀~

  •