2010-02-26 134 views
166

所以我一直在Mercurial中犯了一個愚蠢的錯誤。很多時候,我會開始工作而不進行「hg pull」和「hg update」。當我嘗試推送更改時,出現錯誤。有什麼辦法在Mercurial中刪除本地提交?

有什麼辦法刪除我的本地提交所以我可以避免創建多個頭,分支等?我只想刪除我的本地提交,使用提示合併我的更改,然後重新提交。聽起來很簡單,對吧?我似乎無法找到任何方法輕鬆刪除本地提交,所以我可以乾淨地合併提示。

同樣,我只是試圖刪除用「hg ci」進行的本地提交。我不想修改文件,還原等。

+0

可能重複http://stackoverflow.com/questions/2139165/mercurial-delete-all-local-changesets-revert-to-tree – 2010-02-26 01:53:27

+7

這不是一個愚蠢的錯誤,當幾個人同時使用同一個存儲庫時,這是正常的工作流程 – 2011-07-22 14:31:03

回答

8

您可以使用Rebase extension更容易解決這個問題,只需使用hg pull --rebase即可,您的提交會自動重新計算到拉取版本,避免分支問題。

+1

如果你做錯事情會犧牲不準確的歷史記錄和可能的損壞 – 2011-01-24 15:19:22

12

正如其他人都指出你應該拉,然後合併頭,但如果你真的想擺脫你的提交沒有任何EditingHistory工具,那麼你可以只hg clone -r你的回購得到所有除了那些變化。

+0

「hg clone -r」刪除本地更改?我只想刪除本地提交以保持簡單 – user191535 2010-02-27 22:05:06

+3

它不會從克隆的存儲庫中刪除它們,但會創建一個沒有它們的新克隆,然後您可以刪除您修改的存儲庫像。 – 2010-02-28 04:43:12

196

啓用「MQ」擴展並鍵入以下內容:

hg strip #changeset# 

哪裏#changeset#是要刪除的變更的哈希值。這將刪除所述變更集,包括下降的變更集。

欲瞭解更多信息,請檢查Strip Extension

如果你得到「unkown command」strip'「,你可能需要啓用它。要做到這一點找到.hgrcMercurial.ini文件,並添加以下代碼行:

[extensions] 
mq = 

注意(約扎斯在他的評論中提到的),其具有多個頭是水銀正常的工作流程。你不應該使用strip命令來對付它。相反,你應該把你的腦袋和腦袋合併,解決任何衝突,測試,然後推。

strip命令在您真正想擺脫污染分支的變更集時非常有用。事實上,如果你在this question的情況,要完全刪除所有‘草案’變更集永久,檢查出the top answer,基本上建議這樣做:

hg strip 'roots(outgoing())' 
+2

沒有strip命令可用 – BHS 2011-10-07 19:34:25

+7

@Bharath:您需要啓用分機 – Samaursa 2011-10-07 20:32:31

+3

@samaursa你怎麼做?您提供給Strip Extension的鏈接會導致不存在的wiki頁面。 – Nilzor 2013-06-17 11:23:57

13

現代答案(僅後相關Mercurial 2.1):

使用Phases並將您不想共享的修訂標記爲祕密(私有)。這種方式,當你推他們不會被髮送。

在TortoiseHG中,您可以右鍵單擊提交以更改其階段。

另外:你也可以使用擴展名「rebase」將你的本地提交移動到共享庫的頭部。

+0

Private == secret now – 2014-03-27 12:32:56

5

如果您熟悉git,您會很樂意使用histedit,其工作方式與git rebase -i類似。

67

如果使用汞龜剛剛激活擴展 「MQ」 中:

  1. 文件/設置/擴展/
  2. 選擇MQ

然後從中選擇要開始分條的底部修訂版它,並選擇:

  1. 修改歷史
  2. 地帶

就像這樣:

enter image description here

在這個例子中它將會從擦除第19次修改爲最後一次提交(22)。

+1

'File/Settings/Extensions/「我希望我能增加更多選票。非常感謝你! – dyatchenko 2015-08-14 19:37:25

+0

唉!我試過這個,但它似乎轉儲了我所有的更改,儘管沒有檢查「無備份」或「丟棄本地更改」。我想保留這些更改,只是不提交它們!現在有什麼方法可以恢復它們嗎? – 2015-12-14 16:08:25

+2

我似乎無法找到正確的方法,但它似乎保持您需要傳遞'--keep'的內容,而TortoiseHg不會提供該選項。所以......你需要在命令行用'hg strip -r來完成它。 --keep'。 – 2015-12-14 16:11:44

8

我也遇到過這個問題。我做了2 commit,並希望回滾和刪除這兩個提交。

$ hg rollback 

hg rollback只是回滾到最後一次提交,而不是2次的提交。那時我沒有意識到這一點,我改變了代碼。

當我發現hg rollback剛剛回滾一個提交時,我發現我可以使用hg strip #changeset#。所以,我用hg log -l 10找到最新的10次提交,並得到我想要的strip正確的changeset。

$ hg log -l 10 
changeset: 2499:81a7a8f7a5cd 
branch:  component_engine 
tag:   tip 
user:  myname<[email protected]> 
date:  Fri Aug 14 12:22:02 2015 +0800 
summary:  get runs from sandbox 

changeset: 2498:9e3e1de76127 
branch:  component_engine 
user:  other_user_name<[email protected]> 
date:  Mon Aug 03 09:50:18 2015 +0800 
summary:  Set current destination to a copy incoming exchange 

...... 

$ hg strip 2499 
abort: local changes found 

abort: local changes found是什麼意思?這意味着hg找到尚未提交的代碼的更改。因此,要解決這個問題,您應該使用hg diff來保存您已更改的代碼,並保存hg reverthg strip #changeset#。就像這樣:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff 
$ hg revert file_you_have_changed 
$ hg strip #changeset# 

後你做了上面,你可以patch的差異文件和你的代碼可以重新添加到您的項目。

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff 
1

hg strip是你在找什麼。如果你熟悉git,它類似於git reset

使用控制檯:

  1. 你需要知道的版本號。 hg log -l 10。該命令顯示最近10次提交。找到你正在尋找的提交。您需要更改行的4位數字changeset: 5888:ba6205914681

  2. 然後hg strip -r 5888 --keep。這將刪除提交記錄,但保留所有文件修改,然後您可以重新提交。 (如果你想刪除文件,只是刪除--keep hg strip -r 5888

相關問題