04.Git从放弃到入门:撤销操作

616 阅读3分钟

前言

本文介绍不同阶段的撤销操作命令。

本系列更多文章详见专栏 📚 Git从放弃到入门

放弃本地更改

📌有时候修改了本地工作目录(通常也叫工作区)的文件,如何放弃本地更改(尚未暂存)?

首先将项目切换至master分支最新版本。

$ git checkout master

更改 helloworld.html,新增一条注释(错误内容)。

<html>

<head>
</head>

<body>
    <h1>Hello, World!</h1>
    <!-- 新增一条注释,错误内容. 接下来将会重置它. -->
</body>

</html>

检查工作区的状态。

$ git st (git status)

显示文件 helloworld.html 已修改,尚未暂存。

image.png

git checkout

使用 git checkout <file> 命令来检出仓库中的版本文件,舍弃工作目录中的更改。

$ git checkout helloworld.html
$ git st
$ cat helloworld.html

显示在工作目录中不存在更改。文件中的新增注释内容也被还原了。

image.png

git restore

根据提示也可以使用git restore,该命令还是实验性的,功能可以发生变化。git-restore v2.32.0 doc

$ git st
$ git restore helloworld.html
$ git st
$ cat helloworld.html

参照上文更改文件,检查工作目录状态后,运行git restore 即可舍弃工作目录中的更改。与 git checkout效果一样。

image.png

取消暂存的更改

📌 有时候暂存了更改,尚未提交至仓库,如何取消暂存的更改?

更改 helloworld.html,新增一条注释(错误内容)。

<html>

<head>
</head>

<body>
    <h1>Hello, World!</h1>
    <!-- 新增一条注释,错误内容. 接下来将会重置它. -->
</body>

</html>

使用git add暂存更改。

$ git add helloworld.html

检查工作目录状态,显示更改已被暂存且准备提交。

image.png

git reset

使用 git reset 命令重置 HEAD 中暂存区的内容,清除已经暂存的更改。

$ git reset HEAD helloworld.html

image.png

git restore --staged

使用 git restore --staged 命令也能清除已经暂存的更改。

$ git restore --staged helloworld.html 

image.png

放弃本地更改

git reset git restore --staged 命令默认不会更改工作目录。所以在工作目录中文件仍存在已更改。若要移除这些更改,可以使用之前示例中的 checkout 或 restore 命令。

$ git checkout helloworld.html  # git restore helloworld.html
$ git st

现在工作目录又变干净了。

image.png

撤销提交的更改

📌 有时候发现已经提交至本地仓库的更改不正确并想撤销该提交?

更改 helloworld.html 文件并提交

<html>

<head>
</head>

<body>
    <h1>Hello, World!</h1>
    <!-- 我不想提交这个更改. -->
</body>

</html>

暂存更改并提交。

$ git add helloworld.html
$ git commit -m "这个更改不想提交"

image.png

git revert 还原提交

git revert命令还原操作就是Git会生成一个新提交的选项,提交将会撤消一个已存在提交的所有修改。

因为将撤销最后一次提交,所以使用 HEAD作为还原的参数。

$ git revert HEAD

运行命令将进入到编辑器中。

image.png

最新三次提交参数 (HEAD, HEAD^, HEAD~2)

若不打开编辑器,命令中添加 --no-edit 。

$ git revert HEAD --no-edit

image.png

查看日志纪录,可以看到原始提交纪录和“撤销”还原操作提交纪录。

image.png

移除分支提交纪录

📌 如何将提交纪录移除?

当使用git revert进行还原提交,移除错误操作,恢复代码,但是历史纪录中仍会显示还原提交纪录和错误提交纪录。若涉及敏感文件时,即使还原操作后,但是历史纪提交录中仍能看到文件内容,涉及数据安全问题。

首先将最新的提交打上标签,查看项目提交历史。

$ git tag unwanted 
$ git hist 

image.png

git reset --hard

查看日志纪录,标签“v1”之后的提交都是错误提交纪录和原提交纪录。可以使用 git reset 命令重置当前分支到制定提交,可以使用标签名或提交hash。

$ git reset --hard v1
$ git hist  

执行命令后 master分支指向标签为v1的提交,错误的提交还原纪录都看不到了。

image.png

🚨 --hard 标记是 reset 命令唯一的危险用法。它强制覆盖了工作目录中的文件,会真正地销毁数据,无法撤销。

错误的提交还原纪录并没有消失,仍然在仓库中,只能使用哈希值引用它们。使用git log -all查看全部纪录。

image.png

移除标签

仓库会保留未引用的提交会一段时间直到垃圾回收运行。通过移除标签释放引用,将错误提交还原提交纪录作为垃圾被回收。

git tag -d unwanted
git hist --all     

此时历史纪录干干净净的,没留下一点痕迹。

image.png

📚参考&关联阅读

“git_reset”, Pro_git_v2_zh ebook

关注专栏

如果本文对您有所帮助请关注➕、 点赞👍、 收藏⭐!您的认可就是对我的最大支持!

此文章已收录到专栏中 👇,可以直接关注。