[英]Rolling back to an old revision in Mercurial (like git reset)
使用git,我可以使用像這樣的命令丟棄錯誤或意外的提交
git reset --soft HEAD^
它將當前分支(例如master
)重置為當前修訂版的父提交HEAD^
而不觸及工作樹 - 如果你想要刪除工作樹,你可以用--hard
替換--soft
。
另外,如果我想擺脫多個提交,我可以使用像這樣的命令
git reset --hard 53b94d0
這讓我完全回到了承諾53b94d0,好像我之后從未做過任何事情。
什么是Mercurial(hg)等價物?
雖然Mercurial沒有提供一個簡單的替代方案,並且不同於可變歷史的概念,但有幾種方法可以實現一些接近的東西。 在這篇文章中,我將概述其中的一些內容。
如果您特別想撤消上次提交,可以使用:
hg rollback
這將取消提交(不接觸工作樹 - 您應該能夠使用hg revert --all
或hg update -C
來跟隨它,如果你想重置整個工作目錄)。
假設您要將名為giraffe
的存儲庫重置為修訂版77182fb7451f。 如果你cd
到父目錄並運行:
hg clone -r 77182fb7451f giraffe new-giraffe
cp giraffe/.hg/hgrc new-giraffe/.hg/
那么你最終會得到新長頸鹿,一個修訂版本為77182fb7451f的存儲庫。 ( cp
是必要的,以確保新的長頸鹿paths
(如git的“遙控器”)正確指向原始倉庫而不是默認情況下的giraffe
文件夾。)
這比從互聯網重新克隆更快,因為它只在磁盤上本地復制文件(在許多系統上,硬鏈接它們以節省更多時間和空間),但如果您的存儲庫很大,仍然非常耗時。
如果你想通過修改提交歷史來做更復雜的事情(順便說一句,這在hg世界中有些不受歡迎),首先通過在.hgrc
添加以下行來啟用Mercurial Queues擴展 (不需要指定等號后的路徑):
[extensions]
mq =
這為您(以及其他有用的東西) hg strip
命令提供了從存儲庫中完全刪除變更集及其所有后代的功能。 因此,您可以使用如下命令:
hg strip 1cc72d33ea76
如果1cc72d33ea76是您要刪除的存儲庫中的第一個“壞”變更集。
不幸的是,使用這種方法通常很難刪除完全正確的變更集,並且很容易最終得到多個頭(你可以使用hg heads
查看),需要繁瑣的重復應用hg strip
才能到達你想要的位置沒有額外的頭腦。
使用hg revsets你可以刪除所有的祖先.
(當前版本),它們不是您想要恢復的修訂版的祖先,使用如下命令:
hg strip "ancestors(.) and not ancestors(77182fb7451f)"
確保首先運行:
hg log -r "ancestors(.) and not ancestors(77182fb7451f)"
這將顯示hg strip
將刪除的所有變更集,因此您可以確保不會無法修復您的提交歷史記錄(因為您有備份......對嗎?)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.