如何使用 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+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告