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