2012-07-04 68 views
7

使用GIT,我可以扔掉一個錯誤或意外提交使用命令等回滾到舊的版本在水銀(如git的復位)

git reset --soft HEAD^ 

其中當前分支(如master)復位爲當前修訂版的父級提交HEAD^而不觸摸工作樹 - 如果您想要刪除工作樹,則可以使用--soft替換--hard

另外,如果我想擺脫一個以上的承諾,我可以使用如下命令

git reset --hard 53b94d0 

這使我回正好犯53b94d0,就好像我從來沒有承諾以後的事情。

什麼是Mercurial(hg)等效物?

回答

19

儘管Mercurial沒有提供一個簡單的替代方案,並且避開了可變歷史的想法,但有幾種方法可以實現一些近似。在這篇文章中,我將概述其中的一些。

汞柱回滾

如果你特別想撤消前提交,你可以使用:

hg rollback 

將取消提交(不碰工作樹 - 你應該能夠如果您想重置整個工作目錄,也可以使用hg revert --allhg update -C)。

汞柱克隆-r

假設你想重置庫稱爲giraffe修訂77182fb7451f。如果您cd到父目錄,然後運行:

hg clone -r 77182fb7451f giraffe new-giraffe 
cp giraffe/.hg/hgrc new-giraffe/.hg/ 

那麼你會用新長頸鹿,在修訂77182fb7451f存儲庫結束。 (該cp是必要的,以確保新長頸鹿paths(如Git的「遙控器」)正確,因爲它會默認至原點回購而不是向giraffe文件夾。)

這比從互聯網上再克隆快因爲它只能在磁盤上本地複製文件(並且在許多系統上,硬連接它們以節省更多時間和空間),但是如果您的存儲庫很大,仍然會非常耗時。

汞柱條

如果你想修改提交歷史(這有點在汞世界皺起了眉頭,順便)做更復雜的東西,先加入以下行啓用Mercurial Queues extension.hgrc(有沒有必要等號後面指定路徑):

[extensions]                  
mq = 

這給你(除其他有用的東西)的hg strip命令從庫中完全刪除變更和其所有後代。因此,你可以使用如下命令:

hg strip 1cc72d33ea76 

如果1cc72d33ea76是在你的倉庫的第一個「壞」變更要刪除。

不幸的是,通常很難使用這種方法來去除完全正確的變更,這一切都太容易多頭(你可以使用hg heads查看)結束了,需要的hg strip繁瑣重複的應用程序,然後才能去的地方你希望沒有額外的頭。

汞柱條使用revsets

使用hg revsets可以刪除它們要恢復到修訂的祖先.(當前版本)的所有祖先,使用如下命令:

hg strip "ancestors(.) and not ancestors(77182fb7451f)" 

確保第一次運行:

hg log -r "ancestors(.) and not ancestors(77182fb7451f)" 

它會告訴你人l hg strip將刪除的更改集,因此您可以確保不會對您的提交歷史記錄造成無法挽回的損害(因爲您有備份......對嗎?)。

+0

因此,在hg中,等效的重置/回滾不僅僅是改變分支標記提交的內容,還涉及到數據庫的一些實際更改。 – jthill