如何在 Git 中使用 reset 命令撤銷錯誤的合併?


假設我們執行了一個合併提交,後來發現程式碼無法編譯或應用程式無法工作。如果我們在合併時犯了錯誤,就會發生這種情況。在這樣的情況下,我們需要使用以下任一方法撤銷合併:−

  • reset 命令;或
  • revert 命令

git reset 命令可用於撤消對 Git 儲存庫狀態的本地更改。git resetHEAD指標移動到給定的提交,並更新索引以匹配該提交。此命令會重寫提交歷史記錄。但是,如果我們已與其他團隊成員共享了我們的提交,或者如果我們已將程式碼推送到遠端儲存庫,則不應使用此方法。

考慮以下示例,其中儲存庫有兩個分支 - 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

更新於: 2021年4月30日

2K+ 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.