如何使用 Git revert 命令撤销错误的合并?


假设我们执行了一个合并提交,共享了这个提交,但后来发现代码无法编译或应用程序无法工作。如果我们在合并时犯了错误,就会发生这种情况。在这种情况下,我们需要使用 git revert 命令撤销合并。

考虑下图,其中存储库有两个分支 *master* 和一个特性分支。这两个分支都已分叉,并且每个分支都有两个提交。特性分支中的提交 ( *C3* 和 C4) 已合并到主分支中,生成的提交已共享。假设由于错误的合并导致项目编译失败。

我们不会使用 **git reset** 命令来撤销错误的合并,因为错误的合并已共享,我们不想重写历史记录。与 reset 命令不同,**git revert** 命令将反转错误合并提交引入的更改,并创建一个将复制所需提交的新提交。

使用 revert 命令的语法是:

$git revert -m <parent> HEAD

上面命令中的 **-m** 标志是必须的,并且后面应该跟一个大于零的数字。这是因为合并提交有两个父提交——主分支上的一个父提交和特性分支上的另一个父提交。要撤销合并提交,我们应该告诉 git 我们希望它如何撤销更改。**-m** 选项用于指定新提交应该复制的父提交。

在我们的示例中,错误的合并有两个父提交;主分支的 *c2* 是第一个父提交,特性分支的 C4 是第二个父提交。以下命令将撤销错误合并所做的更改,并创建一个将复制第一个父提交 – *c2* 的新提交。

$git revert -m 1 HEAD

如下图所示

以下说明了这种情况:

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo
$ git init
Initialized empty Git repository in E:/tut_repo/.git/

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ echo abc>abc.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git add .

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git commit -m 'abc'
[master (root-commit) 91773ff] abc
1 file changed, 1 insertion(+)
create mode 100644 abc.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git branch feature

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git switch feature
Switched to branch 'feature'

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (feature)
$ echo lmno>lmno.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (feature)
$ git add .

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (feature)
$ git commit -m 'lmno'
[feature e1c99eb] lmno
1 file changed, 1 insertion(+)
create mode 100644 lmno.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (feature)
$ git switch master
Switched to branch 'master'

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git log --oneline --all --graph
* e1c99eb (feature) lmno
* 91773ff (HEAD -> master) abc

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ echo mh>mh.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git add .

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git commit -m 'mh.txt'
[master 862ce37] mh.txt
1 file changed, 1 insertion(+)
create mode 100644 mh.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git log --oneline --all --graph
* 862ce37 (HEAD -> master) mh.txt
| * e1c99eb (feature) lmno
|/
* 91773ff abc

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git merge feature
hint: Waiting for your editor to close the file... unix2dos: converting file E:/tut_repo/.git/MERGE_MSG to DOS format...
dos2unix: converting file E:/tut_repo/.git/MERGE_MSG to Unix format...
Merge made by the 'recursive' strategy.
lmno.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 lmno.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git log --oneline --all --graph
* 8216241 (HEAD -> master) Merge branch 'feature'
|\
| * e1c99eb (feature) lmno
* | 862ce37 mh.txt
|/
* 91773ff abc

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git revert HEAD
error: commit 821624117bbdaab5cc581ef9a29e22ed40bf3679 is a merge but no -m option was given.
fatal: revert failed

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git revert -m HEAD
error: option `mainline' expects a number greater than zero

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ ls
abc.txt lmno.txt mh.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ git revert -m 1 HEAD
Removing lmno.txt
hint: Waiting for your editor to close the file... unix2dos: converting file E:/tut_repo/.git/COMMIT_EDITMSG to DOS format...
dos2unix: converting file E:/tut_repo/.git/COMMIT_EDITMSG to Unix format...
[master 12ae6f3] Revert "Merge branch 'feature'"
1 file changed, 1 deletion(-)
delete mode 100644 lmno.txt

$ dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (master)
$ ls
abc.txt mh.txt

更新于:2021年4月30日

11K+ 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告