撤消 git rebase 指南
一、概述
git rebase 是編寫乾淨的代碼提交歷史的推薦最佳實踐,尤其是對於多開發人員代碼存儲庫。手動完成此操作後,我們可能稍後會意識到我們要返回到原始狀態。
在本教程中,我們將探討一些撤消 git rebase 操作的技術。
2. 設置
讓我們創建一個測試台來模擬具有多個分支的多開發人員代碼存儲庫。我們可以假設development
分支是項目的唯一真實來源,每個開發人員都使用它來使用特定於特性的分支來處理特定特性:
現在,假設我們已經為項目準備好上述版本控制,讓我們檢查feature2
分支:
$ git branch --show-current
feature2
最後,讓我們看看feature1
和feature2
分支的代碼提交歷史:
$ git log feature1
commit e5e9afbbd82e136fc20957d47d05e72a38d8d10d
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:27:22 2022 +0530
Add feature-1
commit 033306a06895a4034b681afa912683a81dd17fed
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:27:22 2022 +0530
Add .gitignore file
$ git log feature2
commit 9cec4652f34f346e293b19a52b258d9d9a49092e
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:27:22 2022 +0530
Add feature-2
commit 033306a06895a4034b681afa912683a81dd17fed
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:27:22 2022 +0530
Add .gitignore file
在後續部分中,我們將重複使用此基本場景來執行git rebase
,然後一次應用一種方法來撤消 rebase 操作。
3. 使用ORIG_HEAD
讓我們從一個乾淨的場景檢查feature2
分支的當前提交開始:
$ git log HEAD
commit 728ceb3219cc5010eae5840c992072cac7a5da00 (HEAD -> feature2)
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
commit 6ed8a4d2a961fdfc4d5e4c7c00b221ed6f283bf4 (development)
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add .gitignore file
現在,讓我們在feature2
分支之上feature1
分支:
$ git rebase feature1
做完rebase操作後,我們看一下HEAD
參考:
$ git log HEAD
commit 9d38b792d0c9a8d0cd8e517fcb2ca5260989cc4a
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
commit 1641870338662a016d5c8a17ef5cada0309f107e
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-1
commit 6ed8a4d2a961fdfc4d5e4c7c00b221ed6f283bf4
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add .gitignore file
此外,我們可以驗證ORIG_HEAD
仍然指向728ceb3219cc5010eae5840c992072cac7a5da00
提交:
$ git log ORIG_HEAD
commit 728ceb3219cc5010eae5840c992072cac7a5da00
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
commit 6ed8a4d2a961fdfc4d5e4c7c00b221ed6f283bf4
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add .gitignore file
最後,我們使用ORIG_HEAD
參考進行reset
:
$ git reset --hard ORIG_HEAD
$ git log HEAD -1
commit 728ceb3219cc5010eae5840c992072cac7a5da00
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
而已!在ORIG_HEAD
的幫助下,我們成功地恢復了 rebase 操作。
4. 使用git reflog
同樣,讓我們從一個全新的場景設置開始:
$ git log HEAD
commit 07b98ef156732ba41e2cbeef7939b5bcc9c364bb
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-2
commit d6c52eb601e3ba11d65e7cb6e99ec6ac6018e272
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 17:53:35 2022 +0530
Add .gitignore file
現在,讓我們做一個 rebase 並檢查提交歷史:
$ git rebase feature1
$ git log HEAD
commit b6ea25bf83ade2caca5ed92f6c5e5e6a3cb2ca7b
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-2
commit d2cabe48747699758e2b14e76fb2ebebfc49acb1
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-1
commit d6c52eb601e3ba11d65e7cb6e99ec6ac6018e272
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 17:53:35 2022 +0530
Add .gitignore file
接下來,讓我們使用git reflog
命令細粒度地檢查事件記錄:
$ git reflog
b6ea25b [email protected]{0}: rebase (continue) (finish): returning to refs/heads/feature2
b6ea25b [email protected]{1}: rebase (continue): Add feature-2
d2cabe4 [email protected]{2}: rebase (start): checkout feature1
07b98ef [email protected]{3}: commit: Add feature-2
d6c52eb [email protected]{4}: checkout: moving from feature1 to feature2
d2cabe4 [email protected]{5}: commit: Add feature-1
d6c52eb [email protected]{6}: checkout: moving from development to feature1
d6c52eb [email protected]{7}: Branch: renamed refs/heads/master to refs/heads/development
d6c52eb [email protected]{9}: commit (initial): Add .gitignore file
我們可以注意到 git 在內部以粒度級別維護引用,其中HEAD
在 rebase 操作之前的位置由[email protected]{3}
引用表示。
所以,作為最後一步,讓我們通過執行git reset
來恢復之前的狀態:
$ git reset --hard [email protected]{3}
$ git log HEAD
commit 07b98ef156732ba41e2cbeef7939b5bcc9c364bb
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-2
commit d6c52eb601e3ba11d65e7cb6e99ec6ac6018e272
Author: Tapan Avasthi <[email protected]>
Date: Sun Jul 31 17:53:35 2022 +0530
Add .gitignore file
偉大的!我們也成功地學習了這種方法。但是,這種方法使用了 git 的一些低級細節,只有高級 git 用戶才能使用它。
5. 結論
在本文中,我們使用了 git 存儲庫的測試場景,並了解了兩種流行的技術來撤消git rebase
操作。