前言
本文介绍不同阶段的撤销操作命令。
本系列更多文章详见专栏 📚 Git从放弃到入门 。
放弃本地更改
📌有时候修改了本地工作目录(通常也叫工作区)的文件,如何放弃本地更改(尚未暂存)?
首先将项目切换至master分支最新版本。
$ git checkout master
更改 helloworld.html
,新增一条注释(错误内容)。
<html>
<head>
</head>
<body>
<h1>Hello, World!</h1>
<!-- 新增一条注释,错误内容. 接下来将会重置它. -->
</body>
</html>
检查工作区的状态。
$ git st (git status)
显示文件 helloworld.html
已修改,尚未暂存。
git checkout
使用 git checkout <file>
命令来检出仓库中的版本文件,舍弃工作目录中的更改。
$ git checkout helloworld.html
$ git st
$ cat helloworld.html
显示在工作目录中不存在更改。文件中的新增注释内容也被还原了。
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
效果一样。
取消暂存的更改
📌 有时候暂存了更改,尚未提交至仓库,如何取消暂存的更改?
更改 helloworld.html
,新增一条注释(错误内容)。
<html>
<head>
</head>
<body>
<h1>Hello, World!</h1>
<!-- 新增一条注释,错误内容. 接下来将会重置它. -->
</body>
</html>
使用git add
暂存更改。
$ git add helloworld.html
检查工作目录状态,显示更改已被暂存且准备提交。
git reset
使用 git reset
命令重置 HEAD
中暂存区的内容,清除已经暂存的更改。
$ git reset HEAD helloworld.html
git restore --staged
使用 git restore --staged
命令也能清除已经暂存的更改。
$ git restore --staged helloworld.html
放弃本地更改
git reset
git restore --staged
命令默认不会更改工作目录。所以在工作目录中文件仍存在已更改。若要移除这些更改,可以使用之前示例中的 checkout 或 restore 命令。
$ git checkout helloworld.html # git restore helloworld.html
$ git st
现在工作目录又变干净了。
撤销提交的更改
📌 有时候发现已经提交至本地仓库的更改不正确并想撤销该提交?
更改 helloworld.html
文件并提交
<html>
<head>
</head>
<body>
<h1>Hello, World!</h1>
<!-- 我不想提交这个更改. -->
</body>
</html>
暂存更改并提交。
$ git add helloworld.html
$ git commit -m "这个更改不想提交"
git revert 还原提交
git revert
命令还原操作就是Git会生成一个新提交的选项,提交将会撤消一个已存在提交的所有修改。
因为将撤销最后一次提交,所以使用 HEAD作为还原的参数。
$ git revert HEAD
运行命令将进入到编辑器中。
最新三次提交参数 (
HEAD
,HEAD^
,HEAD~2
)
若不打开编辑器,命令中添加 --no-edit 。
$ git revert HEAD --no-edit
查看日志纪录,可以看到原始提交纪录和“撤销”还原操作提交纪录。
移除分支提交纪录
📌 如何将提交纪录移除?
当使用
git revert
进行还原提交,移除错误操作,恢复代码,但是历史纪录中仍会显示还原提交纪录和错误提交纪录。若涉及敏感文件时,即使还原操作后,但是历史纪提交录中仍能看到文件内容,涉及数据安全问题。
首先将最新的提交打上标签,查看项目提交历史。
$ git tag unwanted
$ git hist
git reset --hard
查看日志纪录,标签“v1”之后的提交都是错误提交纪录和原提交纪录。可以使用 git reset
命令重置当前分支到制定提交,可以使用标签名或提交hash。
$ git reset --hard v1
$ git hist
执行命令后 master
分支指向标签为v1的提交,错误的提交还原纪录都看不到了。
🚨
--hard
标记是 reset 命令唯一的危险用法。它强制覆盖了工作目录中的文件,会真正地销毁数据,无法撤销。
错误的提交还原纪录并没有消失,仍然在仓库中,只能使用哈希值引用它们。使用git log -all
查看全部纪录。
移除标签
仓库会保留未引用的提交会一段时间直到垃圾回收运行。通过移除标签释放引用,将错误提交还原提交纪录作为垃圾被回收。
git tag -d unwanted
git hist --all
此时历史纪录干干净净的,没留下一点痕迹。
📚参考&关联阅读
“git_reset”, Pro_git_v2_zh ebook
关注专栏
如果本文对您有所帮助请关注➕、 点赞👍、 收藏⭐!您的认可就是对我的最大支持!
此文章已收录到专栏中 👇,可以直接关注。