你可能不知道的git revert操作细节

git revert主要用于还原一个或多个现有提交,并生成一条新的更改记录。

日常开发过程中,可能会出现要发版的时候,发现master分支上合并了这一期不需要发版的功能点,需要将这些提交还原。

以下是 git 官网 给出的git revert 命令相关的选项。

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>
git revert (--continue | --skip | --abort | --quit)

选项

...

用于还原指定的某次提交记录

git revert 版本号
git revert HEAD~3
git revert -n master~5..master~2

对于合并的提交记录,如果直接使用 git revert 2a06e3ca2840277c6c3d1991f4f815cec0fea546,则会提示下面的错误信息:

error: 提交 2a06e3ca2840277c6c3d1991f4f815cec0fea546 是一个合并提交但未提供 -m 选项。 fatal: 还原失败

git revert -m 2a06e3ca2840277c6c3d1991f4f815cec0fea546

error: 选项 `mainline’ 期望一个大于零的数字

这就需要用到下面的这个命令选项

-m parent-number | --mainline parent-number

该选项主要用于还原 merge 操作产生的记录。也是我们在工作场景中最容易用到的一个命令。

引自官网原文

Usually you cannot revert a merge because you do not know which side of the merge should be considered the mainline. This option specifies the parent number (starting from 1) of the mainline and allows revert to reverse the change relative to the specified parent.

Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.

合并产生的提交记录会指向两个父结点:如下图所示
你可能不知道的git revert操作细节_第1张图片

在还原合并的提交的时候我们要指定以那个父节点为 mainline 本保留该主线的提交记录。

所以就会出现我们经常会用到的指令:

git revert -m 1 32f842e7542bfb8b5d4dcf8fbe905028b1b99f33

这个命令的具体含义就是还原 feat_revert 分支合并过来的提交记录。并保留 release-brance的提交记录。

你可能不知道的git revert操作细节_第2张图片

我们可以看到在release-brance分支生成了一个新的提交,提交的内容就是还原了
feat_revert 分支合并过来的提交记录。

如果执行#2父节点为 mainline

git revert -m 2 32f842e7542bfb8b5d4dcf8fbe905028b1b99f33

这个命令的具体含义就是还原 release-brance的提交记录,并保留feat_revert 分支合并过来的提交记录。

执行结果如下:

你可能不知道的git revert操作细节_第3张图片

-e | --edit

该选项是默认选项,允许我们修改提交的commit message

--no-edit

该选项不允许我们修改提交的commit message,会直接生成提交信息,并自动提交。

-n | --no-commit

不进行自动提交,默认会自动提交commit.

sequencer子命令

--continue

继续当前的还原操作。在处理完冲突后可以使用这个命令继续操作。

--skip

跳过当前提交并继续序列的其余部分。

--quit

退出当前正在进行的操作。可用于在cherry-pickrevert失败后清除sequencer state

--abort

取消操作,返回之前的状态。

你可能感兴趣的:(git,git)