? 这是我参与更文挑战的第10天,活动详情查看: 更文挑战
0x00 ? 前言
? Git入门系列文章链接如下,请按照顺序阅读文章 ?。
本系列文章主要通过示例实践讲解快速掌握 Git 基础用法,实现快速入门。
本文是第四篇,介绍不同阶段的撤销操作。
0x01 放弃本地更改
?有时候修改了本地工作目录(通常也叫工作区)的文件,如何放弃本地更改(尚未暂存)?
首先将项目切换至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
效果一样。
0x02 取消暂存的更改
? 有时候暂存了更改,尚未提交至仓库,如何取消暂存的更改?
更改 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
复制代码
现在工作目录又变干净了。
0x03 撤销提交的更改
? 有时候发现已经提交至本地仓库的更改不正确并想撤销该提交?
更改 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
复制代码
查看日志纪录,可以看到原始提交纪录和“撤销”还原操作提交纪录。
0x04 移除分支提交纪录
? 如何将提交纪录移除?
当使用
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
复制代码
此时历史纪录干干净净的,没留下一点痕迹。
0x05 ?参考
“git_reset”, Pro_git_v2_zh ebook
0x06 关注专栏
此文章已收录到专栏中 ?,可以直接关注。
更多文章继续阅读|系列文章持续更新