Git从放弃到入门(四)

? 这是我参与更文挑战的第10天,活动详情查看: 更文挑战

0x00 ? 前言

? Git入门系列文章链接如下,请按照顺序阅读文章 ?。

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 已修改,尚未暂存。

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

0x02 取消暂存的更改

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

更改 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

0x03 撤销提交的更改

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

更改 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

0x04 移除分支提交纪录

? 如何将提交纪录移除?

当使用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

0x05 ?参考

“git_reset”, Pro_git_v2_zh ebook

0x06 关注专栏

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

更多文章继续阅读|系列文章持续更新

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享