2011-04-05 13 views
3

我有提交A,B,C,D和E.我意識到在提交B中發生了一件非常糟糕的事情,所以我想恢復到A,這次更改正確之前將B擰緊,然後自動重新應用C,D和E.Mercurial Reverting Back,然後重新應用更改集

您可能想知道爲什麼我不回覆到B並在那裏修復,然後重新回到E(這是個好主意嗎?)。我之所以不理解這個原因,但它與一組特殊的視覺工作室文件(這些文件只能通過Visual Studio中的一些GUI屏幕進行編輯)中出現的問題有關,這些文件在簡單地糾正時效果不佳發生錯誤後的文件...如果我知道它們,我會給出更多細節

+0

如果變化不是很大,我可能只是手動撤消它,然後檢入新版本F.如果這是一個很大的變化,那麼你得到了我。我剛開始使用mercurial,所以我也會對這個答案感興趣! – DarinH 2011-04-05 18:11:32

回答

4

這可以使用Mercurial Queues(mq)完成。你想:

  1. 導入變更B到E到到E MQ
  2. 取消應用的變更Ç
  3. 修復變更B和到E刷新補丁
  4. 再塗Ç
  5. 敲定補丁

這樣做如下:

  1. cd <project>
  2. hg qinit
  3. hg qimport --rev B:E
  4. hg qpop --all
  5. hg qpush <patch name for B>
  6. ...修理你B中
  7. hg qrefresh
  8. hg qpush --all
  9. hg qfinish --applied中發現的問題

這一切都假定B到E沒有被推到任何公共倉庫。如果他們已經被推動,那麼你最好的選擇就是簡單地把問題解決在一個新的變更集(F)中。

+0

這裏的想法是實際改變記錄的變更集的歷史記錄。根據我對Mercurial和GIT的理解,GIT比mercurial更適合改變歷史,但我也明白mercurial可以做到。不過,對我而言,我似乎永遠不想改變歷史變更集,相反,我總是希望以任何必要的方式「固定」最新的提示,然後作爲新的變更集進行提交,並進行適當的評論。那是不是推薦?我對hg自己很新... – DarinH 2011-04-06 17:52:00

+0

@drventure:我的答案中列出的行動將改變歷史。這在Mercurial中通常是不被接受的,但是如果你改變的變更集從未被推送到遠程,那麼它是安全的。一旦變更集被推送到遠程,那麼你不應該試圖改變它們。相反,您應該創建一個新的變更集,以反轉/修復問題(如您已經注意到的)。 – 2011-04-06 17:59:14

+0

改變尚未分發的歷史記錄(推送到或從中刪除)是安全的。許多人對改變歷史不滿,但我個人更傾向於保持歷史的清潔。如果我搞砸了一個提交,那就不需要我的團隊的倉庫混亂了。在我與他們分享我的承諾之前,我可以解決它。 – bambams 2011-09-26 18:07:51

5

只需將您在B中完成的任務退出並將其提交爲F.這樣,歷史記錄就會完好無損,您的同事將無需知道即可獲得更改。

如果B是服務版本,請在那裏進行更改並將其合併到F中。

3

您也可以使用HisteditExtension(而不是MqExtension)。 MqExtension功能更強大,但我認爲它也複雜得多。 HisteditExtension有點像git rebase --interactive

pick d0844102a010 A 
pick a9448f0ba534 B 
pick b754f9f2513b C 
pick 736f7f2363ff D 
pick 05bb58f48597 E 

# Edit history between d0844102a010 and 05bb58f48597 
# 
# Commands: 
# p, pick = use commit 
# e, edit = use commit, but stop for amending 
# f, fold = use commit, but fold into previous commit 
# d, drop = remove commit from history 
# 

每條線路均對應一個承諾:

# Ordinarily it would be something like (I'd normally do -r -5, instead): 
hg histedit d0844102a010 

你的文本編輯器將用看起來是這樣的文件被打開。第一個單詞是指要應用於該提交的命令。默認的「pick」只是保持提交,保持不變。使用「編輯」進行更改(包括提交日誌更改),「摺疊」將其與前一個提交相結合,「刪除」將其完全刪除。

就你而言,你可能只需要將第一行更改爲「編輯」即可。

請記住,你必須使用hg histedit --continue代替hg commit(如果你是「編輯」,或者如果有一個合併衝突)。 :)如果你遇到衝突,並且事情看起來不太好,你只想取消,那麼你可以使用hg histedit --abort

# Fix up files... 
vim foo bar baz 

# Finished; apply the changes (and pray for a clean merge ;). 
hg histedit --continue 

當然,自己承擔編輯歷史的風險。我建議您在編輯歷史記錄之前創建源樹的備份tarball或zip,直到熟悉這些命令爲止。

+0

在Mercurial中使用更簡單的解決方案。 – 2016-11-04 17:31:59

相關問題