🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

撤销GitHub上的更改!reset、revert、checkout用法入门

通过之前的文章,我们学习了如何使用`git add`和`git commit`来记录文件的更改。然而,开发过程中难免会出错。“糟了,提交了错误的文件!”或者“还是想回到上一个版本……”这类情况屡见不鲜。

Git的强大之处在于,它具备了能够安全、简便地撤销这些操作失误的功能。本文将以通俗易懂的方式,按不同情况分别解说用于“撤销”更改的三个主要命令——`git checkout``git reset``git revert`——之间的区别及具体用法。掌握了这些,您就再也无需害怕操作失误了!


三个“撤销”命令:何时使用哪个?

Git中有多个用于撤销更改的命令,这一点常常让初学者感到困惑。首先,让我们简单梳理一下各自的作用和使用场景。

形象地说,`reset`像是“乘坐时光机回到过去,将未来(提交)抹去”,而`revert`则像是“为过去的错误重新发表一篇订正文章”,两者之间存在这样的差异。


实践!不同情况下的“撤销”步骤

那么,让我们根据具体的场景,来看看各个命令的用法吧。

情况一:希望放弃工作中的更改,且尚未提交 (`checkout`)

这是指编辑了文件后,又觉得“还是放弃所有这些更改吧”的情况。这是在暂存(staging)前恢复更改的最简单方法。

首先,为了练习,请修改一个文件。然后用`git status`检查更改,会发现文件显示为“modified”。要放弃这项更改,请执行以下命令。

git checkout -- [文件名]

例如,如果想取消对`index.html`的更改,命令如下:

git checkout -- index.html

执行此命令后,指定的文件将完全恢复到最后一次提交的状态。注意:通过此操作删除的更改无法恢复!

情况二:希望取消上一次的提交(还未推送)(`reset`)

这是指“提交了才发现错了!”但还未与任何人共享(未推送)的本地失误的撤销情况。`reset`有几个选项,我们介绍其中常用的。

首先,用`git log --oneline`检查提交历史,确认要取消的提交位于最顶端。

git log --oneline

选项1:--soft(仅取消提交,保留更改内容)
用于只取消上一次的提交,但希望将该次提交所做的更改保留在暂存区的情况。在“提交信息写错了”等时候非常方便。

git reset --soft HEAD^

选项2:--mixed(取消提交和暂存)
用于取消上一次的提交,并将更改内容退回到工作目录。这是`reset`命令的默认行为。在“忘了添加某个文件”时,可以先重置,然后再重新`add`和`commit`。

git reset --mixed HEAD^

选项3:--hard(完全删除提交和更改内容)
用于将上一次的提交及其更改内容彻底、无痕地删除。这是一个危险的命令,因为对文件的更改本身将无法恢复,所以使用时需要特别小心。

git reset --hard HEAD^

HEAD^指向“前一次的提交”。如果想回到两次提交前,可以指定为`HEAD^^`或`HEAD~2`。

情况三:希望撤销已经推送的提交 (`revert`)

在团队开发中,如果用`reset`删除已经推送的提交,会导致与其他人的历史记录产生矛盾,造成巨大混乱。因此,在取消已公开的提交时,务必使用`revert`。

`revert`会自动创建一个能够抵消指定提交内容所有更改的“新提交”。它不是删除历史,而是通过添加新的历史来修正错误,是一种安全的方法。

首先,用`git log`查找希望撤销的提交的ID(哈希值)。

git log

复制希望撤销的提交的哈希值(例如:`1a2b3c4d`),然后执行以下命令。

git revert 1a2b3c4d

执行后,会打开一个提交信息的编辑界面。如果默认信息即可,直接保存并关闭。这样就创建了“撤销提交”,最后再将这个提交`push`出去,远程仓库的修改就也同步了。


【可复制代码】用于实践的HTML示例

为了方便尝试Git操作,有一个可以实际修改的文件会很方便。请将以下HTML代码保存为`practice.html`等文件名,然后对这个文件尝试`add`、`commit`、`checkout`、`reset`等操作。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Git练习页面</title>
    <style>
        body { font-family: sans-serif; text-align: center; margin-top: 50px; }
        .box { width: 200px; height: 200px; margin: 20px auto; border: 2px solid #333; display: flex; justify-content: center; align-items: center; font-size: 1.5rem; }
        .box.red { background-color: #ffcccc; }
        .box.blue { background-color: #cceeff; }
        button { padding: 10px 20px; font-size: 1rem; cursor: pointer; }
    </style>
</head>
<body>
    <h1>练习Git操作</h1>
    <div id="colorBox" class="box">文本在此</div>
    <button id="changeColorBtn">更改颜色</button>
    <script>
        const colorBox = document.getElementById('colorBox');
        const changeColorBtn = document.getElementById('changeColorBtn');
        changeColorBtn.addEventListener('click', () => {
            if (colorBox.classList.contains('red')) {
                colorBox.classList.remove('red');
                colorBox.classList.add('blue');
                colorBox.textContent = '已变为蓝色!';
            } else {
                colorBox.classList.remove('blue');
                colorBox.classList.add('red');
                colorBox.textContent = '已变为红色!';
            }
        });
    </script>
</body>
</html>

总结:根据情况选择最合适的命令

最后,简单总结一下这三个用于撤销更改的命令的用法。

只要熟练运用这三个命令,就再也不用害怕Git的操作失误了。请放心地、尽情地编写代码和提交吧!