欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Git Revert 探究

程序员文章站 2022-05-17 19:07:36
...

Git Revert 探究

引言

今天跟大家分享一个Git Revert的实践。最近在项目中做一些跟持续集成(CI)相关的工作,其中有一块涉及代码的回退操作(Revert),我们需要自动化地实现这些功能,因此需要调用Git的命令来完成。

回退代码的方式

在使用Git作为代码管理工具时,常见的回退代码方式有两种,一是 reset 命令:

git reset commit_id

这条命令可以让本地的Git目录回退到指定的commit ID,并且不会保留该commit之后的commit记录。详细的文档可以参考这里。这有时不是我们想要的,我们的需求可能是既可以回退代码到某一个版本,又保留这期间的所有commit记录,这时就需要用到 revert 命令:

git revert commit_id

这条命令撤回指定commit的改动,注意是撤回某个改动,不是撤回到某个改动。另外,这条命令不会删除任何commit记录,而是会新增一条Revert操作的commit记录(弹出commit message的编辑窗口)。举个例子,我在一个空的Git目录里创建了一个 test.txt 文件,并添加了一行文本。然后添加一行文本,提交一次,一共添加两行。到这里,一共有三个commit产生:

commit ab2e366cf06c0bc0591e4abcdb671d6aa22c8ffa "Add 3rd line."
commit 2a980c12d3e8ee49ebb9a3fcffee4e2f2794ec8f "Add 2nd line."
commit 17a141dc77811320d75f258f7d3e53d91633fdfe "Init commit."

这时如果想去掉第三行文本的改动,可以执行如下操作:

git revert ab2e366cf06c0bc0591e4abcdb671d6aa22c8ffa

或者直接:

git revert HEAD

这时Git的Log类似这样:

commit 0d90a9a82353019b14721394567dae174a5d8f35 "Revert 'Add 3rd line.'"
commit ab2e366cf06c0bc0591e4abcdb671d6aa22c8ffa "Add 3rd line."
commit 2a980c12d3e8ee49ebb9a3fcffee4e2f2794ec8f "Add 2nd line."
commit 17a141dc77811320d75f258f7d3e53d91633fdfe "Init commit."

我们可以看到原来的commit并没有消失,而是多了一条Revert操作的commit。查看文件,其中最后一行已经不见了。这里我们需要注意的是执行Revert操作的顺序。我们有时需要回退掉多个commit的修改,revert 命令也支持这样的参数(参考这里),但不按顺序的Revert可能会导致冲突,只有解决了冲突之后再执行:

git revert --continue

如果不想继续操作,可以放弃:

git revert --abort

如果是从最新的代码开始回退,我们不妨按顺序依次Revert每个commit,以避免冲突。

一些实践

有时候我们在做Revert操作需要一些检查,比如查看对应的commit记录是否存在:

git branch -r --contains COMMIT_ID

这条命令可以查看哪些分支(Branch)上有指定的commit记录,由此我们可以判断是不是需要在当前分支上进行Revert操作,这里的commit ID也可以换成tags。我们还可以比较与某个版本的区别:

git diff --shortstat COMMIT_ID

3 files changed, 481 insertions(+), 139 deletions(-)

shortstat 选项让结果只显示简短的统计数据。在实现自动化脚本时,这些命令可以用来实现需要的逻辑。

参考资料

  • https://git-scm.com/docs/git-revert
  • https://git-scm.com/docs/git-reset
相关标签: 碎片