2011-11-19 71 views
7

我用的Git在過去,我是小白汞:汞柱:刪除最新提交

我有以下的版本庫結構:

o [> default] commit A 
| 
o commit B 
. 
. 
. 
o <a-tag] 
| 

我已經更新到與提交a-tag並承諾提供其他一些提交。現在我有

o [> default] commit C 
| 
o commit D 
| 
| o [default] commit A 
| | 
| o commit B 
| . 
| . 
| . 
|/
o <a-tag] 
| 

現在(前推),我意識到,我有我的提交commit Ccommit D基於錯誤的承諾。我怎樣才能回到初始狀態(而不必重新克隆庫)下降,這些提交commit Ccommit D(掛件git reset --hard a-tag)?

回答

8

你可以用「條」永久刪除提交和所有它的後代。你的情況,你需要指定「d」修訂ID:

hg strip -r D 

注:剝離的變更在.hg /條

[extensions] 
mq= 

水銀備份軟件包:MQ擴展必須打開 - 備份,所以這個操作是相當安全的。

1

我只想從合適的點克隆並刪除舊的回購。 沒有克隆考慮hg backout撤消第一個C,然後d,或者,如果這是你的最終目標hg rebase於C和d移動到commit A點。

1

Backout C +回退d將移除這些2個提交,但是添加額外的3(回退+回退+合併)。 「乾淨」 從歷史記錄中刪除可能

如果你想只更改錯誤的父級更正,你必須使用rebase,因爲@chill提到

4

你說沒有克隆,我會去那,但首先我要指出,這樣做:

cd .. 
hg clone -r -2 yourrepo yournewrepo 

是瞬間動作,讓你一個新的克隆,在本地,沒有你的老回購的最後兩次提交。由於它是本地克隆,它使用硬鏈接(即使在Windows上),因此存儲庫不會佔用額外的磁盤空間。

這是經典的Mercurial解決方案。 Mercurial是建立在一個永恆不變的歷史理念之上的。如果歷史上有某種東西讓你後悔,那麼它會反過來(這就是backout所做的),所以歷史顯示了錯誤及其修正 - 就像科學家的日誌。如果你在歷史上不能忍受/不能忍受它,你會像上面顯示的那樣排除它。

不是每個人都能這麼... ...鐵桿關於他們的歷史,大量的擴展表明了將修改​​的歷史,但它們必須專門啓用。在您的情況下,您已經安裝的rebase擴展(它現在與Mercurial一起)將會按照您的要求進行。你只需要在你的~/.hgrc中啓用它,然後將D重新設置爲A.如果你真的只想讓C去掉,那麼mq擴展中的strip命令將會這樣做。它還附帶Mercurial。