2010-09-21 82 views
37

我做了一個大的oops,並可以使用一些幫助撤消它。撤消hg推送(退出?)

我們有兩個倉庫,一個相當穩定的庫,和庫我們在變化的工作,我只是在我們的倉庫穩定作出了缺陷修復程序,並移動它到工作庫。我從穩定的存儲庫中取出,合併,然後意外地推送到穩定的存儲庫。

穩定的庫現在看起來是這樣的:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

其中a是提交應該是穩定的倉庫一角,b爲所有我們在開發庫已經做了的東西, c是我們分支開發庫的一點。

我如何去使它回:

*a 
| 
*c 

(我知道我真的不能進行更改走了,我只是在尋找一個功能結構...)

我讀過一些讓我覺得這樣的事情hg backout是我需要的命令,但我不完全確定它的作用。

回答

45

hg rollback恢復最後一筆交易,所以您將剩餘未完成的合併,您必須使用hg update -C才能離開。

如果您不想* b(您在另一個克隆中有),請啓用內置的MQ擴展並運行hg strip -r <*b>。它將擺脫* b和*合併。默認情況下,它會保存備份以防再次改變主意。


UPDATE(每@魯迪的評論:對不起,我錯過了「已經推入」部分)

由於合併已經推出,永遠不要做什麼,我剛纔所說。討厭同行開發者的電子郵件會是最好的結果。

而是執行此操作:

hg up -r<*merge> 
hg revert -r<*a> -a 
hg ci -m "undo unintended merge" 

或者你可以更潔淨:

hg up -r<*merge> 
hg backout -r<*merge> --parent<*a> 
+1

由於合併已被推動,合併提交不能被回滾(推和拉也是交易)。這個操作也需要在每個從穩定版本庫中提交這個提交的工作拷貝中完成。 – Rudi 2010-09-22 08:18:48

+0

使用回退和回覆有什麼區別?我最終使用退出,但我想知道我的選項(儘管我希望它不會再發生!) – Neil 2010-09-22 14:41:31

+2

'backout'在現有變更集之上提交新的變更集以有效地反轉變更。 'revert'會改變你的工作副本並且不會提交。 – 2010-09-22 15:02:53

0

hg rollback將恢復最後一次提交,刪除否則將作出的任何歷史記錄。

所以,如果你開始與此:

*merge 
| \ 
| \ 
| *b 
*a | 
|/
*c 

汞柱回滾會給:

*a *b 
|/
*c 

注意,你只能做hg rollback只有一次。

你應該做的回滾之前使庫的完整備份。要做到這一點,只需hg clone整個存儲庫。

+1

我認爲你的意思是回滾,而不是回退。 :) – 2010-09-22 00:32:43

+0

我剛剛更新了這篇文章,所以沒有它應該是:) – 2010-09-22 06:53:24

2

我覺得後期製作hg rollback既然你已經被推更改。

您可以嘗試使用MQ擴展,但這也適用於本地。 hg strip只會修改您的本地回購。你當然可以試着直接在服務器上修改你的服務器repo,但是如果有人拉它,它爲時已晚。

另一種選擇是在hgbookchapter 9描述備份出合併。它涉及hg backout命令,但它可能是一個矯枉過正的你...

我建議hg update -C *修訂,合併提示,並忽略來自*合併的所有更改?您的倉庫看起來或多或少像這樣比:

*second merge 
| \ 
| \ 
| \  
|  \ 
*merge | 
| \ | 
| \ | 
| *b | 
*a |/
|// 
*c--- 

命令 - 這是

  • $ hg --config ui.merge=internal:local merge #keep my files
  • $ hg --config ui.merge=internal:other merge #keep their files

更多細節可以發現here

0

對於這個問題,你們幾乎都沒有提出複雜的解決方案,這對我們任何人都可能會發生。

我做了什麼,我在遠程桌面上登錄到我的中央存儲庫,然後用mq擴展名將修訂狀態更改爲「草稿」和「約定」。

它唯一的缺點是,如果有人有剝離版本的副本,並將推動,他們將重新出現。所以,如果可以的話,請別人 一)做相同(草案條) B)刪除其本地資源庫,並修改一個

都可以用TortoiseHg輕鬆實現重新同步。