撤销GitHub上的更改!reset、revert、checkout用法入门
通过之前的文章,我们学习了如何使用`git add`和`git commit`来记录文件的更改。然而,开发过程中难免会出错。“糟了,提交了错误的文件!”或者“还是想回到上一个版本……”这类情况屡见不鲜。
Git的强大之处在于,它具备了能够安全、简便地撤销这些操作失误的功能。本文将以通俗易懂的方式,按不同情况分别解说用于“撤销”更改的三个主要命令——`git checkout`、`git reset`和`git revert`——之间的区别及具体用法。掌握了这些,您就再也无需害怕操作失误了!
三个“撤销”命令:何时使用哪个?
Git中有多个用于撤销更改的命令,这一点常常让初学者感到困惑。首先,让我们简单梳理一下各自的作用和使用场景。
git checkout: 用于希望将工作目录中的更改恢复到提交前的状态。最适用于“这个文件的更改,我还是决定全都不要了!”这种情况。git reset: 用于希望取消尚未推送(push)的本地仓库中的提交。这是一个能让提交“仿佛从未发生过”的强大命令,但由于它会改写历史,所以绝不能用于已经共享的远程仓库。git revert: 用于希望撤销已经推送(push)并公开的提交。它并非删除提交,而是创建一个“能够抵消指定提交内容的新提交”。这是一种能够安全修正历史的方法,在团队开发中是必不可少的命令。
形象地说,`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 checkout -- [文件名] - 取消本地的提交 →
git reset [选项] HEAD^ - 撤销已公开的提交 →
git revert [提交ID]
只要熟练运用这三个命令,就再也不用害怕Git的操作失误了。请放心地、尽情地编写代码和提交吧!