2010-02-01 80 views
33

假設我在工作目錄中進行了一些更改並意外標記了幾個文件(包括一些修改後的文件)以供刪除。如何取消刪除文件而不會丟失我所做的更改?撤銷Mercurial中的移除操作

回答

17

hg revert

我敢肯定水銀甚至使得在默認情況下更改備份。

+1

是的,除非你不告訴它,改變放在.orig文件 – 2010-02-01 10:16:30

+1

我剛剛運行'hg恢復'在一個文件我間接刪除與'hg mv'。它沒有**保存我的更改,並且恢復到上次提交的副本。 – cesar 2011-09-23 02:43:44

+4

這不是正確的答案。恢復改變目錄的工作,這個問題是關於如何撤消「刪除標記」 – 2012-05-11 17:09:15

21

有使用hg revert兩個選項:

汞柱恢復-a

這將返回到以前的版本,並把你的新文件中的所有變化與那些.orig追加到名稱

hg恢復[刪除文件的名稱],以恢復這些文件

我可能會去與後者

+0

好吧,我知道恢復。由於我使用了「hg remove -Af」(即在下一次提交中而不是從磁盤中將文件從存儲庫中刪除),我一直在尋找一種解決方案,只取消文件的標記以便保留在存儲庫中。 「hg revert」也將替換以前的版本。 我預計會有類似於「hg add」/「hg forget」的方式。 「hg forget」只是在下一次提交中將標記爲添加的文件取消標記。 – Kostas 2010-02-02 12:00:39

+0

AFAIK恢復是你的唯一選擇去除 - 當然刪除的幫助說看到恢復刪除的東西(而你說的添加建議忘記作爲oposite)。你應該得到.orig文件,但是你的更改在 – 2010-02-02 13:04:07

+0

嚴重。我只是想讓它從我不小心「忘記」的文件中刪除「刪除」標記。我不希望我的文件被修改。 如果我不小心加了,hg忘記解除它。相反是不正確的。如果我忘記一個文件,沒有任何數量的hg add'ing會取消標記。 BOOOOOOO TERRIBLE UX。 – 2012-04-04 20:12:08

3

在您對jk的評論中,我檢查了hg forget。它似乎只是hg remove -Af的一個快捷方式,這意味着這是hg add的真正對立面。

接下來,如果您使用hg remove -Af,那麼您應該能夠使用hg add恢復(我剛剛嘗試過,似乎工作)。

2

標記存儲在.hg/dirstate文件中。在發佈hg remove -Af之前,您需要做的只有一項。它可能看起來像這樣(未測試):

hg clone bad-repo orig-repo 
cp orig-repo/.hg/dirstate bad-repo/.hg/dirstate 
cd bad-repo 
hg status 

最後一個命令應顯示刪除文件之前的狀態。

32

只是hg add的文件。

我不知道爲什麼你會得到一些修改工作目錄的答案。如果您不小心標記了一些要刪除的文件,則可以使用添加進行撤消。

[email protected]:~/hgtest$ hg status --all 
M another_file 
C a_file 
[email protected]:~/hgtest$ hg remove --after --force * 
[email protected]:~/hgtest$ hg status --all 
R a_file 
R another_file 
[email protected]:~/hgtest$ hg add * 
[email protected]:~/hgtest$ hg status --all 
M another_file 
C a_file 

這就是說,不hg remove或曾經真正使用--force。也試圖養成使用hg forget而不是hg remove --after,

+0

很確定這是正確的答案 - 並需要更多upvotes推到頂部。 – slim 2013-02-11 10:43:41

+7

警告:在未經修改的文件上執行'hg remove [file]'將文件從文件系統中移除。在這種情況下,'hg add [file]'失敗,並且將其添加回來必須執行'hg revert [file]'。 'hg add [file]'是在刪除之前修改過的文件的正確答案。 – dinosaur 2014-10-28 20:15:21

+0

這是真的。這就是爲什麼'忘記'總是一個更好的選擇。將刪除保留爲舊的(非mercurial)'rm'。 – 2014-10-29 04:21:21

3

的習慣我有完全相同的問題。 hg addhg forget相反(正好相反)。但是,嘗試重新添加目錄本身不起作用。相反,我必須在每個文件上使用hg add

hg st | egrep "^R" | sed -e "s/R //" | xargs hg add 

希望有所幫助。請注意,就我而言,我沒有任何理由想要刪除。如果您有一定要刪除的文件,請相應地調整grep。

5

如果該文件存在,(很可能你已經與hg forget標記爲刪除或者如果已修改它,然後hg remove d吧),做hg add [file]與後最後一次提交之前所做的任何更改將其添加回忘記文件。

如果文件不存在(如果該文件未被修改,並且您使用hg remove標記了要刪除的文件),請執行hg revert [file]以將其恢復到其在工作目錄父級中的狀態。

+1

這個答案遠遠勝過最受歡迎的答案,因爲它解釋了爲什麼以及何時每個命令都可以工作,而不是僅僅放棄一個配方。 – 2015-07-16 08:50:19