如果我有一堆未提交的更改,並且希望將其放在一邊而不用處理某些其他內容,然後稍後(在幾天後再填充)回來到它並繼續工作。完成這個最簡單的工作流程是什麼? (到目前爲止,我只有Mercurial的基本功能的經驗)。我通常的方法是使用克隆創建一個新分支,但可能有更好的方法。如何在處理其他事情時將一堆未提交的更改放在一邊
回答
您有少數選擇:
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"
提交至本地,更新以前的更改集並繼續工作,並利用匿名的分支(或多頭)的。如果你想要更改,你可以合併頭部。如果你不想要更改,你可以strip更改集。
hg commit -m"Commiting unfinished work in-line." hg update -r<previous revision> hg strip -r<revision of temporary commit>
他們提交到指定的分支。工作流程與選項3相同 - 合併或剝離後即可。
hg branch "NewBranch" hg commit -m"Commiting unfinished work to temporary named branch." hg update <previous branch name>
我個人使用選項3或4,我不介意剝變化集或檢查,在部分代碼(只要不最終會推)。這可以與新的Phase一起使用,以便在需要時隱藏其他用戶的本地變更集。
我還使用rebase
命令來移動變更集以避免合併,因爲合併不會在代碼的歷史記錄中添加任何內容。合併我傾向於保存重要分支(如發佈分支)之間的活動或來自較長壽命功能分支的活動。還有我用於壓縮變化集的命令histedit
,其中「變化」會降低值。
補丁隊列也是這樣做的常見機制,但它們具有堆棧語義。您推送並彈出修補程序,但在堆棧中的「下面」另一個修補程序中的修補程序要求也會推送它上面的修補程序。
警告與所有這些選項一樣,如果文件因您暫時擱置/排隊/分支的臨時更改而發生更多更改,將會在取消擱置/推送/合併時需要合併解析。
你可以多次克隆你的回購。我傾向於有一個根克隆,然後從那裏有多個孩子。例如:
- MyProject.Root
- MyProject.BugFix1
- MyProject.BugFix2
- MyProject.FeatureChange1
- MyProject.FeatureChange2
4個孩子的全部從克隆根並推/拉到/從根。然後根在網絡/互聯網上的某個地方從主回購站點推/拉。根可以作爲你的個人分級區。
所以在你的情況下,你只需克隆一個新的回購並開始工作。讓你的'擱置'工作單獨在其他回購中。就這麼簡單。
唯一的缺點是磁盤空間的使用,但如果這是一個問題,你根本就不會使用DVCS;)哦,它確實污染了你的Visual Studio「近期項目」列表,但是嘿嘿。
[編輯如下評論]: -
總之那麼......你在做什麼完全是罰款和正常的。我認爲這是在以下情況下最好的工作方式:1)它是短暫的2)不需要與其他開發者合作3)更改不需要離開你的電腦直到提交/推送時間。
就個人而言,我不喜歡任何迄今爲止發佈的答案:
- 我不喜歡克隆分支,因爲我喜歡每個項目都只有一個目錄。同時在不同的目錄上工作,完全混淆了編輯者最近的文件歷史。我總是最終改變錯誤的文件。所以我不再那樣做了。
- 我使用
shelve
進行快速修復(如果我意識到自己在錯誤的位置,只是將我的未經改動的更改移動到另一個分支)。你說的是幾天,我不會擱置好幾天。 - 我覺得
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
感謝您的詳細解答!我非常喜歡閱讀人們針對這些(普通?)問題的工作流程。 – Erik 2012-07-27 07:16:41
我認爲'mq'對於這種情況來說有點複雜,但它有足夠廣泛的用途,包括這一點,值得花時間流利地使用它。 – 2014-06-20 16:41:46
爲了保持本地未提交的更改,對我來說最簡單的辦法就是將它們保存爲一個補丁文件。
hg diff > /tmp/`hg id -i`.patch
,當你需要恢復到以前的狀態:
hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch
我會去掉'/ tmp'和'hg id -i',它也可以在Windoze上運行。 – 2014-08-08 20:37:31
那裏不需要'hg up'。 – 2014-08-08 20:38:24
@techtonik如果我在另一個修訂版上應用修補程序,會發生什麼?特別是如果修補文件被修改。 – mapcuk 2014-08-15 13:51:37
- 1. 在合併其他更改提交
- 2. Subversion將未提交的更改提交到一個新分支
- 3. 在一個活動中提交的更改在按下後退按鈕時未反映在其他活動中
- 4. 如何撤消提交併將更改提交到Git中的其他分支?
- 5. SVG邊境的其他更好的比來解釋每一件事情一個
- 6. 如何將未被更改的更改從一個分支轉移到其他
- 7. 推送其他人提交的更改
- 8. 撤銷放棄的未提交更改
- 9. 單獨的未提交的合併和其他更改集市
- 10. 如何在一個處理程序中處理多個更改事件?
- 11. 處理未被其他元素處理的Javascript事件
- 12. 如何在提交時將提交按鈕重定向到其他網站?
- 13. 在Git中處理臨時更改(不提交)
- 14. Drupal 7 #ajax更改事件可以防止同一元素上的其他更改事件處理程序
- 15. 如何將已提交但未修改的更改移至另一個分支?
- 16. 如何停止處理其他事件
- 17. 如何將查詢放在一邊,但我們在一邊嗎?
- 18. eclipse的SVN插件:如何警告用戶其他未提交的更改?
- 19. 如何在同一事務中讀取未提交的數據
- 20. 如何更改處理器堆棧?
- 21. 如何處理在使用Data.Acid時更改事件的實現
- 22. 如何以其他用戶的身份提交更改到Git?
- 23. TCP在監聽時做其他事情
- 24. 如何自提交在改變事件的web2py一個組分
- 25. Html - 在ONE提交過程中阻止其他提交事件?
- 26. 其他處理更改日期格式
- 27. 如何放棄Perforce中所有未提交的更改?
- 28. 如何放棄尚未提交的所有Mercurial更改
- 29. 使用SVN將未提交的更改合併到其他分支中
- 30. GitHub:「一些未提交的更改將通過同步完成」
感謝偉大的答案和有用的例子。你碰巧知道如果使用hg書籤也是一種選擇嗎? – Erik 2012-07-17 11:23:34
@Erik可能,但我沒有使用它的經驗。 – 2012-07-17 11:27:36
書籤可用於幫助選項3 - 您可以使用書籤來標記您創建的用於存儲更改的修訂。他們不能自己完成任務。 – 2012-07-17 18:13:14