如何在 Git 中使用 reset 命令撤销错误的合并?
假设我们执行了一个合并提交,后来发现代码无法编译或应用程序无法工作。如果我们在合并时犯了错误,就会发生这种情况。在这样的情况下,我们需要使用以下任一方法撤销合并:−
- reset 命令;或
- revert 命令
git reset 命令可用于撤消对 Git 存储库状态的本地更改。git reset 将HEAD指针移动到给定的提交,并更新索引以匹配该提交。此命令会重写提交历史记录。但是,如果我们已与其他团队成员共享了我们的提交,或者如果我们已将代码推送到远程存储库,则不应使用此方法。
考虑以下示例,其中存储库有两个分支 - master 和一个特性分支。这两个分支都已分叉,并且每个分支都有两个提交。我们需要将提交(C3 和 C4)合并到 master 分支中。假设由于错误的合并导致项目编译失败。下图显示了这种情况。
让我们使用“git reset –hard”命令解决此问题,将HEAD指针重置到 master 中的前一个提交(c2)。下图显示了这种情况。重置HEAD指针的命令将是
git reset --hard HEAD~1 //moves one step back
由于没有对错误合并的引用,因此错误合并将被垃圾回收。
$ 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 $ git reset --hard HEAD~1 HEAD is now at 862ce37 mh $ git log --oneline --all --graph * 862ce37 (HEAD -> master) mh.txt | * e1c99eb (feature) lmno |/ * 91773ff abc
广告