跳转至

删除指定 commit 小妙招:git rebase

🌏 Bilibili视频传送门: 删除指定 commit 小妙招:git rebase 🌏

本篇文章将介绍 git 的 rebase 命令,它可以帮助删除某条指定的 commit。

有时候,可能在一个分支中提交了多笔 commit,但是事后又想要删除某些 commit 应该怎么办?

这时候,有些同学就会说使用 git reset 命令就好,但是这其实是不行的。

git reset 命令它的作用是回滚到某个 commit,在这个 commit 之后的所有 commit 都会被删除。

正因如此,才需要介绍 git rebase 命令。

什么情况需要删除指定 commit

什么样的场景才会删除指定的 commit?

以 OneFlow 的 flowvision 仓库作为例子。

假定修改 flowvision 的 README 文件,一共有三个 feature,需要提交三次 commit。

首先,第一个 commit 修改了版本,把 pip install flowvision==0.1.0 改成了 pip install flowvision==0.A.0,保存后,进行提交。

第二个修改,修改了模型,把 <li>AlexNet</li> 修改成 <li>TangNet</li>,保存,进行提交。

第三个 commit,修改了示例代码,将 model = alexnet() 修改成 model = TangNet(),保存,进行提交。

接着,用 git log 查看一下,可以发现这三个 commit 都已经提交了。

那么现在问题就来了,如果后来发现第二个 commit 的修改是不合适的,想要单独删除第二个 commit,同时保留另外两个,第一个和第三个 commit 应该怎么办?

这个时候就需要用到 git rebase 命令了。

使用 git rebase 删除指定 commit

git 的 rebase 命令顾名思义就是需要重新去选择一个 commit 作为 base,然后重新决定这个 base 之后的 commit 要怎么处理。

所以,敲重点来了,它的使用其实是分成两步走的:

第一步:是选择一个 commit 作为新的 base

第二步:是决定这个 base 之后每个 commit 该如何处理

接下来,就实际操作一下。

首先先用 git log 查看一下,找到那三笔 commit 之前的 commit,将它作为 base,这样子在它之后的 commit 就需要重新决定如何处理。

然后,运行 git rebase -i commit_hash, 后面接上我们刚刚选择的 base 的 hash 值。

例子:git rebase -i f9d69755dd876dea481ece7775413d879bcf65a7

这个时候跳转到了一个文本页面,它显示了刚刚做的三个修改的 commit。

找到第二个修改,把 pick 改成 drop ,然后保存,退出,就操作成功了。

pick

drop

接着再 git log 查看一下, 可以发现第二笔 commit 确实神奇地被删除了。

其实 rebase 的功能有很多,除了像刚刚看到的 pick、drop, 还有像 squash、reset 等用处。

感兴趣的同学可以参考一下 git 的帮助文档

Back to top