我有一堆提交,說A,B,C,D,我想保留B,C和D,並作出(BCD)-1的提交。如果我有很多要同時撤消的提交,那麼最簡單的方法是什麼?如何恢復Mercurial中的多個提交?
(我似乎記得看到有關這個計算器疑問,建議我hg update
到A,然後調用hg commit
一些爭論,但似乎我現在不能找到這個問題。)
我有一堆提交,說A,B,C,D,我想保留B,C和D,並作出(BCD)-1的提交。如果我有很多要同時撤消的提交,那麼最簡單的方法是什麼?如何恢復Mercurial中的多個提交?
(我似乎記得看到有關這個計算器疑問,建議我hg update
到A,然後調用hg commit
一些爭論,但似乎我現在不能找到這個問題。)
你」已經回答了你自己的問題,更新回A,並從那裏繼續。如果您需要在這一點上做出新的努力,則需要對文件或其他文件進行更改,如下所述:How can I force mercurial to accept an empty commit。與該帖子鏈接的mail thread描述了一種使用MqExtension刪除BCD的方法(除非您推送了它們):
聽起來像您在尋找backout
。請參閱:
hg help backout
我不認爲它可以在一個回去了多次提交,所以你必須分別備份出來:
hg backout D
hg backout C
hg backout B
這將在d之上建立三個提交該是D和C和B的反向。如果要將這些提交合併到一個更改集中,可以使用rebase --collapse
或其他擴展名之一(例如histedit
或mq
或collapse
擴展名)將其摺疊。
如果你不想背出個人的變化,但把一切都一氣呵成,你可以做到以下幾點:
hg update A
hg debugsetparents D
hg commit -m "revert B-D"
它的醜陋,但它的工作原理。但是,這不會記錄相反的重命名。說實話,我不會推薦這樣做,如果你需要退出這麼多,以至於單個退出命令的輸入太麻煩了,讓我想知道退出是否真的是你想要爲這個特定做的事情案件。
或者,你可以像吉姆和拉斐爾建議的那樣做,並且決定B,C和D在分支上,然後更新回A並繼續在那裏提交(在那個時候分解歷史)。這可能更合適。
這會做我想做的事情(如果我把mq中的三個提交壓縮在一起),但是如果有50個提交,我想撤消它會變得很難處理。 我正在尋找更接近http://stackoverflow.com/questions/1463340/revert-multiple-git-commits(但是對於hg)的接受答案的第二部分,即,相當於git的gg重置 - hard A && git reset --soft @ {1} && git commit -a' – 2012-07-23 16:07:26
我用一種方法在Mercurial中更新了答案。然而,就像你鏈接到的git答案一樣,它實際上並沒有扭轉變更集。這真的讓我想知道爲什麼你會想要恢復如此大的變更集序列。將它們停放在不活動的分支上,似乎更好,並在此之前繼續進行。如果你在你的問題中描述了你的用例,它可能會幫助你更好地解決你的問題。 – 2012-07-25 09:11:00
此外,您可能需要考慮向Mercurial提交功能請求,以便退回命令接受修訂集而不是單個修訂版。 – 2012-07-25 09:13:02
最簡單的方法:
您在變更d和要終止該分支
hg commit --close-branch -m "Branch closed"
現在,只要到變更集A和繼續你的工作commiting新東西
hg up -r A
... change stuff ...
hg ci -m "New stuff"
有B,C和D的分支會在那裏,但它會被終止,它不會在hg heads
中顯示。這將是一個不活躍的分支。
這很容易做到,也很有表現力。如果你看圖,你會看到一個單獨的分支被關閉,「官方」分支將繼續。比在分支機構中產生噪音的回覆和回退變更要好得多。
正如[另一個問題](http://stackoverflow.com/questions/3688263/mercurial-beheading-當你試圖將封閉的頭部推送到另一個存儲庫時,你會得到一個關於創建多個頭部的警告。所以,在你第一次推時使用'hg push --force'。拉封閉的人不會得到任何警告。 – mernst 2013-06-21 15:14:30
這,但只有當D是一個頭。 hg中沒有垃圾回收,所以B,C和D不會丟失。 D將只是一個你可以推動或不推動的頭 - 取決於你。 – DanMan 2014-03-28 21:23:03