Close

git revert

git revert 命令可以被视为“撤销”类型的命令,但是,它不是传统的撤销操作。但它不是从项目历史记录中删除提交,而是解决如何还原提交引入的变更,并用生成相反内容附加一个新的提交。这可以防止 Git 丢失历史记录,对于维护修订历史记录的完整性以及可靠的协作都非常重要。

当您想应用项目历史记录中提交的反向操作时,应该使用还原。例如,如果您正在跟踪一个错误并发现它是由一次提交引入的,那么这可能会很有用。您可以使用 git revert 自动为您完成所有这些操作,而不是手动进入、修复并提交新的快照。


工作原理


git revert 命令用于撤销对存储库提交历史记录的变更。诸如 git checkoutgit reset 等其他“撤销”命令可将 HEAD 和分支引用指针移至指定的提交。git revert 也会接受指定的提交,但是 git revert 不会将引用指针移到此提交。还原操作将接受指定的提交,撤销该提交的变更,然后创建新的“还原提交”。之后,引用指针将更新以指向新的还原提交,使其成为分支的顶端。

为了演示,我们使用下面的命令行示例创建一个示例代码存储库:

$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[main (root-commit) 299b15f] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[main 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[main 86bb32e] prepend content to demo file
 1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit
Git 徽标
相关资料

Git 速查表

Bitbucket 徽标
查看解决方案

了解 Bitbucket Cloud 的 Git

在这里,我们已经在新创建的名为 git_revert_test 的目录中初始化了一个代码存储库。我们已经向代码存储库提交了 3 次,我们在其中添加了一个 demo_file 文件,并对其内容进行了两次修改。在代码存储库设置过程结束时,我们调用 git log 来显示提交历史记录,共显示 3 次提交。在代码存储库处于这种状态的情况下,我们已经准备好启动 git revert

$ git revert HEAD
[main b9cd081] Revert "prepend content to demo file" 1 file changed, 1 deletion(-)

Git revert 需要传入提交引用,没有提交引用就无法执行。这里我们传递了 HEAD 引用。这将还原最新的提交。这与我们还原提交 3602db8815dbfa78cd37cd4d189552764b5e96c58 的行为相同。与合并类似,还原将创建新的提交,这将打开配置的系统编辑器,提示输入新的提交消息。输入提交消息并保存后,Git 将恢复运行。我们现在可以使用 git log 检查代码存储库的状态,看看之前的日志中添加了一个新的提交:

$ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit

请注意,在还原后,第 3 次提交仍保留在项目历史记录中。git revert 没有将其删除,而是添加了一个新的提交来撤销其变更。因此,第 2 次和第 4 次提交代表完全相同的代码库,而第 3 次提交仍然存在于我们的历史记录中,以防我们想返回使用。

常用选项


-e
--edit

这是默认选项,无需指定。此选项将打开已配置的系统编辑器并提示您在提交还原之前编辑提交消息

--no-edit

这与 -e 选项相反。还原不会打开编辑器。

-n
--no-commit

传递此选项将阻止 git revert 创建与目标提交相反的新提交。此选项不会创建新的提交,而是将反向变更添加到暂存索引和工作目录中。这些是 Git 用来管理存储库状态的其他树。有关更多信息,请访问 git reset 页面。

重置与还原


请务必要了解,git revert 撤销单个提交—它不会通过删除所有后续提交来“恢复”到项目的先前状态。在 Git 中,这实际上被称为 reset,而不是 revert。

重置与还原图表

与重置相比,还原有两个重要的优点。首先,它不会变更项目历史记录,这使得它对已经发布到共享存储库的提交来说是一个“安全”的操作。有关更改共享历史记录为何危险的详细信息,请参阅 git reset 页面。

其次,git revert 能够在历史记录的任意时刻将单个提交作为目标,而 git reset 只能从当前提交向后运行。例如,如果您想使用 git reset 撤销旧提交,则必须删除目标提交之后发生的所有提交,将其删除,然后重新提交所有后续提交。不用说,这不是一个很好的撤销解决方案。有关 git revert 和其他“撤销”命令之间差异的更详细讨论,请参阅重置、签出和还原。

摘要


git revert 命令是一种向前移动的撤销操作,它提供了一种撤销变更的安全方法。还原不会删除提交历史记录中的提交,也不会使其成为孤立的提交,而是创建一个新的提交,该提交会撤销指定的变更。在丢失工作方面,git revert 是比 git reset 更安全的替代方案。为了演示 git revert 的效果,我们利用了其他命令,这些命令在其各自的页面上都有更深入的文档说明:git loggit commitgit reset


分享此文章
下一主题

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

人们通过满是工具的墙进行协作

Bitbucket 博客

Devops 示意图

DevOps 学习路径

与 Atlassian 专家一起进行 Den 功能演示

Bitbucket Cloud 与 Atlassian Open DevOps 如何协同工作

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up