在 Git 中恢復合併提交
有時,我們需要合併兩個或多個分支,然後將提交推送到所需的分支。但是後來我們意識到我們不需要在那個倉庫中進行合併,所以這裡的問題是如何撤消或恢復已經推送的合併提交。沒什麼可擔心的。對於這個問題,Git 有一個很好的解決方案,我們將在下面討論。
根據問題的不同,有兩種處理這種情況的方法;一種是它尚未推送到倉庫但已提交。另一個是它被提交併推送到倉庫中。下面討論了這兩種情況:
撤銷未推送的 Git 提交
直接在 Git 中恢復提交是不可能的。儘管如此,我們需要在恢復之前檢查提交。還原後,現在工作目錄的位置與我們推送提交之前的工作目錄位置相同。
我們現在可以應用 git reset
命令將索引指標移回它的位置,即提交之前的位置。例如,如果我們想保留提交 Commit1
和 Commite3
的更改,但恢復提交 Commit2
的更改,請執行此命令。
git reset HEAD~3
此命令會將索引指標返回到提交 Commit2
之前的位置。還原提交後,我們需要再次將更改的檔案新增到工作目錄。例如,執行以下命令:
git checkout Commit1
git add Commit1
git checkout Commit3
git add Commit3
git commit
之後,我們可以將提交 Commit1
和 Commit3
推送到遠端倉庫。
git push
如果我們想合併兩個分支,然後恢復一個分支的更改,我們可以使用以下命令:
git merge --abort
該命令用於取消合併過程。之後,我們可以將更改還原到分支。如果我們想撤銷最後一次提交或多次提交的影響,本節討論的命令很有用。
但是,如果我們想撤銷最後兩次或更多次提交的影響,我們需要將工作目錄重置為最後一次提交之前的狀態。這是因為不可能直接恢復一個或多個提交。
恢復已推送的 Git 提交
在另一種情況下,如果我們已經將合併提交推送到遠端分支並且也推送了它,我們必須進行一個新的提交來恢復更改。我們將執行以下命令:
git revert -m 1 <merge-commit-hash>
這將開發一個新的提交,它將逆轉先前合併提交的更改。但是,這個新提交也將包含原始合併提交的所有更改,因此我們需要編輯提交訊息以表明這是一個還原提交。而我們提到的選項,-m 1
將告訴 Git 我們想要保留合併的分支。
revert command
不會改變工作樹。它只修改索引。revert command
還具有恢復提交的原始訊息的選項。在上面給出的示例中,-m
選項用於恢復提交的原始訊息。revert 命令還可用於從整合提交中恢復特定檔案。
當我們進行更改並決定不再希望保留該更改時,Git revert
是一個有用的工具,可以在我們的本地分支上使用。不建議在公共分支上使用。
眾所周知,git revert 是完全可逆的,不可能撤銷它的改變。如果我們在其分支上不是當前提交的提交上執行 git revert,我們必須非常小心,因為 git revert 將開發具有新提交 ID 的新提交。
如果我們稍後執行 git reset –hard 來恢復 git revert 所做的更改,我們還將刪除建立 git revert 撤消提交的開發人員所做的更改。可以在公共分支上使用 git revert,但根據我的觀點,這樣做不是一個好主意。最好開發一個新分支來進行更改,然後在完成後將其合併到 master
分支中。
如果我們想在公共分支上使用 git revert,請確保我們是唯一在該分支上工作的人,否則我們將撤消其他人的工作。
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn