當我在提交之前檢查我的工作副本(使用hg status
和hg diff
)時,我經常會注意到一些不需要的更改。例如,我可能只是在調試會話期間臨時添加或刪除一些代碼。我可以使用mercurial恢復文件中的一系列行嗎?
我知道我可以使用hg revert
刪除不需要的更改,但是這將刪除整個文件中的所有更改。有沒有辦法恢復文件的一部分?
當我在提交之前檢查我的工作副本(使用hg status
和hg diff
)時,我經常會注意到一些不需要的更改。例如,我可能只是在調試會話期間臨時添加或刪除一些代碼。我可以使用mercurial恢復文件中的一系列行嗎?
我知道我可以使用hg revert
刪除不需要的更改,但是這將刪除整個文件中的所有更改。有沒有辦法恢復文件的一部分?
一種方法是使用像kdiff3
這樣的圖形化比較工具。如果你給它的差異,並選擇「合併當前文件」,你可以一行一行地選擇你想要的。
更好的方法是更頻繁地提交。如果您在添加調試代碼之前習慣於提交,那麼在添加「真實」代碼之前提交或恢復您的調試代碼,可以非常容易地刪除調試代碼,因爲它有自己的修訂版本。或者,您可以將您的調試代碼放在一個單獨的分支中。
+1我已經按照[這些說明](http://mercurial.selenic.com/wiki/KDiff3)啓用'hg kdiff3'命令,並且我找到了「Merge - Merge this文件「菜單項。我花了一段時間才發現,你需要右鍵點擊衝突來選擇你想要選擇的兩個版本中的哪一個,但它似乎工作。我會試試這個。 – 2010-12-14 17:12:04
「合併當前文件」是拼圖的缺失部分。萬分感謝。 – 2016-03-20 11:04:22
TortoiseHg GUI的「Commit」窗口有一個「Hunk Selection」選項卡,允許選擇要提交的文件更改的特定部分。
..但它沒有基於Hunk的恢復.. – user2864740 2015-11-27 05:54:46
@ user2864740,恢復文件並提交您想保留的區塊。 – 2015-11-27 14:39:26
我已經爲您的問題得到了不同的答案,這是我的問題。這對於mercurial queues是一個很好的使用案例!
當我即將開始增加調試代碼的變化,我認爲是準備好了,我做了以下內容:
hg qnew -m "fix for bug #123" fix.patch # basically a local-only commit
hg qnew -m "debugging" dbg.patch # prepare the next changeset at the tip
[add my debugging]
hg qrefresh # update the changeset at the tip
[...]
hg qpop # pop the debugging off the repo history
這需要一點點的習慣 - 你最終不得不重新排序您的修補程序,然後摺疊您在原始工作修補程序中所做的任何修復。
此外,檢查比爾巴里的閣樓擴展。本頁面討論如何將其用於幾個不同的工作流程,以及與使用mq相比的方式。 https://www.mercurial-scm.org/wiki/AtticExtension
我已經與交互ncurses的風格UI hg revert -i
,讓你走動,並選擇部分這樣做您可以根據自己的喜好摧毀文件,比較塊或逐行文件,具體取決於您展開更改的深度。
我不知道如果這是一個標準的hg
功能或沒有,你可以驗證輕鬆不夠的,如果你有它:
> hg revert --help --verbose | grep -- -interactive
-i --interactive interactively select the changes (EXPERIMENTAL)
只要記住,你標記的變化(X
)會是怎樣被核爆,而不是你保留的。
如果您想要更改的提交是例如ba1c841aaff4, 最簡單的就是使用:
hg meld -r ba1c841aaff4^ <filename>
現在點擊中間的右箭頭(指向右側),以恢復你的線條,保存文件並關閉MELD。 kdiff3(舊的和不直觀的)可以替代。
邊注:爲了使用融合在一起,你需要配置它在我們的〜/ .hgrc文件:
[extdiff]
cmd.meld =
[merge-tools]
meld.args=$base $local $other
類似:http://stackoverflow.com/questions/876763/mercurial-revert-a -single-hunk – keturn 2011-01-20 19:47:17