2014-09-03 46 views
0

我經常遇到一個用例,在這個用例中,我確定了事件發生後很久確定的變更集中的一個小錯誤,以便恢復變更集不是一個選項。修復已提交的Mercurial變更集中單條虛線的最簡單方法是什麼?

我已經看了similar questionsthe Mercurial docs for graftgeneral advice on backporting changes但任何不涉及這個「簡單」的使用情況,或者它在DVCS墊底/克隆一個複雜的泥沼歸入/導出/導入是遠遠濫用比它的值得這似乎是一個微不足道的操作。

總之,在由

A -> B -> C -> D -> E 

存儲庫有一個行錯誤,需要在變更B中的一個文件,該文件由許多更改多個文件的固定。有沒有辦法做到這一點,而沒有恢復/修復/重新應用所有的B?只是能夠做

... -> B -> B' -> C -> ... 

會解決這個問題。

請注意,我沒有重新定義概念的上下文,所以除非您願意將它反饋給我,否則不會有太大的幫助。我的需求通常很簡單,我基本上在單用戶模式下使用Mecurial作爲RCS或SVN的高級形式,通常只使用提交,分支和合並(絕對沒有推,拉,導入,導出,重新綁定或其他「分佈式」功能)。是的,我知道我可能會排除很多解決此問題的選項,但我的重點是修復我的代碼,而不是理解我從不使用的Mercurial功能的細粒度行爲(對不起,只是在此處誠實)。

如果這是不可能的,請讓我知道,所以我可以提交我的修復程序作爲F與提交消息,變更集B到E被破壞。

回答

2

如果您已經推換到別的用戶,我勸你只需提交爲F.

如果你沒有,請記住C,d的變更的ID,...都會改變。因此,提交哈希將成爲C',D',...

我已經開始注意到,新的'hg evolve'功能非常適合您的要求。

首先,一個小警告:進化是(我相信)現在仍然是實驗性的。一定要備份!然而,演變似乎是最適合這個的。

首先按照setup instructions

然後,您可以執行以下操作步驟:

  1. 更新到B:hg update -r B
  2. 進行更改。
  3. 提交修改的變更集:hg commit --amend 您現在將得到一個關於不穩定變更集的警告(所有變更集都是B的後代)。
  4. 運行hg evolve --all。這將修改C,D,......以正確基於B'的頂部。
+0

這似乎正是我正在尋找;我會給它一個測試並儘快報告 – arclight 2014-09-03 17:52:31

+1

你必須1)安裝並啓用進化擴展(它不是分發的一部分)2)請記住 - 現在是「實驗」擴展 – 2014-09-04 00:20:16

0

我的經驗是用git,而不是mercurial,所以我可能沒有得到正確的命令。 你想要做的是,有時,在DVCS-land中有時稱爲「rebase」,但我來自不同的版本控制,呃,年份,所以我不認爲它是「rebase」。我只是把它想成「重寫歷史」。這只是一些命令。

勺子喂,呃?這裏談到的平面...

我想你的命令要去這樣的:(?好像它帶有汞,但沒有啓用)

  1. 使
  2. hg up B
    • 使您的修復程序B:你會使它違反代碼,因爲它在B
    • 希望我的命令正確嗎?這應該主要工作目錄設置爲源上進行操作,因爲它是在B點
  3. ...讓你的修復,並承諾對B的頂部的變更:變更看起來像樹:

    A -> B -> C -> D -> E 
         \ 
         -> FIX <--- you are here 
    

    好的,現在是重寫歷史部分。您想要記錄導致E的更改歷史記錄,並將它們重寫爲基於A->B->FIX而不是A->B

  4. hg up E(因爲這是你有興趣在重寫代碼行)
  5. hg rebase --dest FIX
    • 汞是足夠聰明,知道B是一個共同的祖先,所以它會採取後續變化和順序應用它們。

就是這樣。在此之後,你的歷史看起來就像這樣(的要求):

A -> B -> FIX -> C' -> D' -> E' 

我寫了他們作爲C'等,因爲它明白,在這些點源會有所不同比以前是很重要的:具體而言,他們將反映納入FIX。更改集C, D, E對代碼所做的更改應該與C', D', E'中所做的更改相同,除非與修補程序存在某些衝突或其他重疊,在這種情況下,您可能必須手動與應用程序進行交互。

例如,受修補程序影響的代碼重構可能意味着確保更改修補程序也得到了適當的重構。如果版本控制系統無法跟蹤文件之間的代碼,它甚至可能意味着此練習的另一個實例。

重要,也許:如果其他人已經追蹤從回購的變化,已經退出了原來的變更,然後通過這樣做,你已經採取了一些他們的歷史了,這可能真的會打亂他們,這這就是爲什麼你會看到人們尖叫,並把他們的在線髮型關於「變身」。

3

「轉儲」 和明顯的方式:

  • hg up B
  • 修復
  • hg commit
  • hg up E
  • hg merge(具有可能的衝突解決)

即ÿ ou將你的修改作爲B的子代(在當前分支中獲得匿名分支和額外的頭部變更集F),並將F合併到E(作爲G變更集),這將F變更帶入主線。你可以跳過更新到E:在匿名分支的情況下合併的方向沒有多大意義

相關問題