如何使用 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
广告