2012-07-17 12 views
77

如果我有一堆未提交的更改,並且希望將其放在一邊而不用處理某些其他內容,然後稍後(在幾天後再填充)回來到它並繼續工作。完成這個最簡單的工作流程是什麼? (到目前爲止,我只有Mercurial的基本功能的經驗)。我通常的方法是使用克隆創建一個新分支,但可能有更好的方法。如何在處理其他事情時將一堆未提交的更改放在一邊

回答

112

您有少數選擇:

  1. Shelve的項目。這會保存更改並將其從工作目錄中刪除,以便分支可以繼續。它不會創建變更集。

    hg shelve --all --name "UnfinishedChanges" 
    
    hg unshelve --name "UnfinishedChanges" 
    

    更新/編輯:善變的新版本可能需要使用

    hg shelve -n "UnfinishedChanges" 
    hg unshelve "UnfinishedChanges" 
    

    ,您仍然可以使用--name作爲替代-n,但善變似乎並不喜歡--name了。此外,--all不再需要,mercurial實際上會嚇倒它。使用mq的項目。這在某些方面與擱置不太相似,但行爲有所不同。最終結果是相同的,更改將被刪除,並可以稍後重新應用。當推送時,補丁是邏輯變更集,當被彈出時,它們被保存在其他地方並且不是變更集歷史記錄的一部分。

    hg qnew "UnfinishedWork" 
    hg qrefresh 
    hg qpop 
    
    hg qpush "UnfinishedWork" 
    
  2. 提交至本地,更新以前的更改集並繼續工作,並利用匿名的分支(或多頭)的。如果你想要更改,你可以合併頭部。如果你不想要更改,你可以strip更改集。

    hg commit -m"Commiting unfinished work in-line." 
    hg update -r<previous revision> 
    
    hg strip -r<revision of temporary commit> 
    
  3. 他們提交到指定的分支。工作流程與選項3相同 - 合併或剝離後即可。

    hg branch "NewBranch" 
    hg commit -m"Commiting unfinished work to temporary named branch." 
    hg update <previous branch name> 
    

我個人使用選項3或4,我不介意剝變化集或檢查,在部分代碼(只要不最終會推)。這可以與新的Phase一起使用,以便在需要時隱藏其他用戶的本地變更集。

我還使用rebase命令來移動變更集以避免合併,因爲合併不會在代碼的歷史記錄中添加任何內容。合併我傾向於保存重要分支(如發佈分支)之間的活動或來自較長壽命功能分支的活動。還有我用於壓縮變化集的命令histedit,其中「變化」會降低值。

補丁隊列也是這樣做的常見機制,但它們具有堆棧語義。您推送並彈出修補程序,但在堆棧中的「下面」另一個修補程序中的修補程序要求也會推送它上面的修補程序。

警告與所有這些選項一樣,如果文件因您暫時擱置/排隊/分支的臨時更改而發生更多更改,將會在取消擱置/推送/合併時需要合併解析。

+0

感謝偉大的答案和有用的例子。你碰巧知道如果使用hg書籤也是一種選擇嗎? – Erik 2012-07-17 11:23:34

+0

@Erik可能,但我沒有使用它的經驗。 – 2012-07-17 11:27:36

+2

書籤可用於幫助選項3 - 您可以使用書籤來標記您創建的用於存儲更改的修訂。他們不能自己完成任務。 – 2012-07-17 18:13:14

5

你可以多次克隆你的回購。我傾向於有一個根克隆,然後從那裏有多個孩子。例如:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

4個孩子的全部從克隆根並推/拉到/從根。然後根在網絡/互聯網上的某個地方從主回購站點推/拉。根可以作爲你的個人分級區。

所以在你的情況下,你只需克隆一個新的回購並開始工作。讓你的'擱置'工作單獨在其他回購中。就這麼簡單。

唯一的缺點是磁盤空間的使用,但如果這是一個問題,你根本就不會使用DVCS;)哦,它確實污染了你的Visual Studio「近期項目」列表,但是嘿嘿。

[編輯如下評論]: -

總之那麼......你在做什麼完全是罰款和正常的。我認爲這是在以下情況下最好的工作方式:1)它是短暫的2)不需要與其他開發者合作3)更改不需要離開你的電腦直到提交/推送時間。

+0

任何不使用分支的理由?這是他們的目的,並且比回購克隆快得多。 – 2012-07-17 10:35:01

+0

在我的問題中,我闡述了以下內容:我通常的方法是使用克隆創建新分支,但可能有更好的方法。 – Erik 2012-07-17 13:01:05

+1

@AdamHouldsworth,從技術上講,這些都是分支......只是短暫的分支。爲一個短命的工作做一個命名的分支是完全愚蠢的。它濫用指定分支的目的是爲了長期存在的工作故事。 – nbevans 2012-07-17 14:29:54

22

就個人而言,我不喜歡任何迄今爲止發佈的答案:

  1. 我不喜歡克隆分支,因爲我喜歡每個項目都只有一個目錄。同時在不同的目錄上工作,完全混淆了編輯者最近的文件歷史。我總是最終改變錯誤的文件。所以我不再那樣做了。
  2. 我使用shelve進行快速修復(如果我意識到自己在錯誤的位置,只是將我的未經改動的更改移動到另一個分支)。你說的是幾天,我不會擱置好幾天。
  3. 我覺得mq是這樣一個普通的sittuation

太複雜了,我認爲最好的辦法是簡單地提交更改,請比你回到你變更從開始有這些變化和工作之前。有一些小問題,讓我說明一下:

假設你有變更集A.比你開始你的變化。此時你需要暫時擱置一會兒。首先,提交您的工作:

hg ci -m "Working on new stuff" 

如果你願意,你可以添加書籤,以方便以後回來。我總是爲匿名分支創建書籤。

hg bookmark new-stuff 

返回到變更這些修改

hg update A 

從這裏,你的工作之前,並生成變更C.現在你有2頭(B和C),你會被警告時你試着推。您可以通過指定分行的負責人只推一個分支:

hg push -r C 

或者你可以在new-stuff分公司的相位改變的祕密。祕密變更集不會被推送。

hg phase -r new-stuff --secret --force 
+0

感謝您的詳細解答!我非常喜歡閱讀人們針對這些(普通?)問題的工作流程。 – Erik 2012-07-27 07:16:41

+0

我認爲'mq'對於這種情況來說有點複雜,但它有足夠廣泛的用途,包括這一點,值得花時間流利地使用它。 – 2014-06-20 16:41:46

10

爲了保持本地未提交的更改,對我來說最簡單的辦法就是將它們保存爲一個補丁文件。

hg diff > /tmp/`hg id -i`.patch 

,當你需要恢復到以前的狀態:

hg up <REV_WHERE_SAVED> 
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch 
+0

我會去掉'/ tmp'和'hg id -i',它也可以在Windoze上運行。 – 2014-08-08 20:37:31

+0

那裏不需要'hg up'。 – 2014-08-08 20:38:24

+1

@techtonik如果我在另一個修訂版上應用修補程序,會發生什麼?特別是如果修補文件被修改。 – mapcuk 2014-08-15 13:51:37

相關問題