基于 GitFlow 工作流,可能某个提交(commit)导致了 bug,或者有多个提交需要返工,此时你就会用到删除提交。
接下来的内容都基于下面这张 git log 提交记录图来写。
删除最后的提交
当需要删除最新的提交、或最最近的几个提交。比如删除 1 或者 1~3 的提交,使用 git reset
命令。
我们需要关注一下 git reset
的 --hard
和 --soft
参数。
举个例子删除最近两个提交看看:
git reset --soft commit~3
,然后 git status
虽然删除了最近两个提交记录,但是还保存了提交所做的更改。那么你可能也想到了
--hard
就是删除提交记录并不保存所删除记录所做的更改。所以,使用--hard
要注意这些更改是否真的不要保存。
删除提交记录中间的提交
如果想要删除的提交不是最近的记录,而是在提交记录列表中间的一个或者多个,那么我们应该如何处理呢?
其中删除提交列表中间的 commit 又分为两种:删除中间连续的几个 commit 或者删除不连续的commit 。
举个栗子,你可能需要删除上图中的:commit3,commit4,commit~5;不连续的提交记录为 commit3,commit5 。那么 Git 是如何处理的呢?
** 删除提交记录列表中间一个或连续多个的提交用 rebase
,不连续的使用 cherry-pick
**
在这里我们只需要记住 rebase
就可以了。因为想要删除提交记录中间不连续的多个提交记录也可以变换为删除“提交列表中间的一个提交”,我们重复几次“提交列表中间的一个提交”的操作就可以了。所以,记住 rebase 的方法即可。
使用 rebase
首先贴一下我们需要用到的命令:
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
接着我们来删除上图中的第二、第三个 commit:
-
git log
看一下执行命令前的提交记录列表[红色部分表示即将要删除的commit]
- 然后开始删除提交记录2,3[执行 rebase 时会可能遇到冲突,解决冲突不在本文描述范围]
-
git log
看一下删除2,3 commit 之后的提交记录列表。
文章来源:查看