2013-03-29 77 views
3

提交據我所知,每個git的承諾存儲自上次所跟蹤的文件所做的更改提交。有沒有辦法讓你從源代碼中刪除舊的提交?舉例來說,如果你有一個文本文件刪除舊的從源代碼

TextFile.txt的

Text line one 
More text line 

,你說幹就幹,致力於git commit -m "Initial Commit"

你然後再編輯TextFile.txt的

文本文件。 TXT

Text line one 
More text line 
Even more lines 
Just one more line 

,你說幹就幹,致力於git commit -m "Added new lines 2"

然後你在最後編輯製作

TextFile.txt的

Text line one 
More text line 
Even more lines 
Just one more line 
These are the last lines 
In this file 

和COMMITED git commit -m "Added new lines 3"

是否有刪除的方式提交編號爲2的所有更改(「添加新的第2行」),以使該文件看起來像:

TextFile.txt的

Text line one 
More text line 
These are the last lines 
In this file 

(注意除去線Even more linesJust one more line其中被改變作出提交2)

回答

4

你可以用底墊做到這一點(你不需要爲這一個交互式的rebase) :

git rebase HEAD --onto HEAD~2 

這基本上意味着:

採取從頭部,並進一步(因此一個提交)所有提交,並把它們應用到父的父(您第一次提交)。所以父提交(你的第二次提交)因此被跳過。

前:

 HEAD 
     | 
A--B--C 

後:

A--B--C 
\ 
    C' 
    | 
HEAD 

你的頭現在指向C'(原來的C的副本),但現在C'A作爲父母,而不是B

編輯:

從上克拉斯Mellbourn的回答您的評論,似乎要保持承諾,但要撤消它的變化。這就是git revert所做的。

git revert HEAD~1 
+0

這會保留'已刪除的提交'數據,不是嗎? – CoreCode

+0

提交仍在對象數據庫中,但在某段時間後(假設沒有其他分支仍然指向它)對於垃圾收集來說是明顯的。從用戶的角度來看,這個提交似乎沒有了。 – Ikke

+0

任何方式來保存數據? – CoreCode

2

執行交互式底墊,並移除提交

git rebase -i HEAD~2 

這將顯示一個編輯器中的兩個提交列表。完全刪除不需要的提交行。保存並關閉編輯器以完成rebase。 (在倉庫中的原始提交仍在,但會被垃圾收集最終)提交與變更將從您看到歷史消失

+0

這將刪除該提交的所有歷史記錄,不是嗎?有沒有辦法做到這一點,而不是刪除該提交,它提交沒有舊的提交數據? – CoreCode

+0

如果你想要的話,你基本上想要恢復提交2 – Ikke

+0

這將是'git revert HEAD〜'。這會創建一個新的提交,以反轉第二個到最後一個提交中所做的更改。所有這些提交將在您的版本歷史記錄中可見。 –

3

其他答案(由KlasMellbourn和Ikke提供)抹去了「從未發生過」的提交。重寫這樣的歷史並不好(但有時候需要......)。您可以使用git revert(只需使用--help來獲得詳細信息),以創建一個撤銷舊的提交的新提交。

+0

+1,這是正確的答案。除特殊情況外,不得重新使用。 – nneonneo

+0

我恭敬地不同意。重新激活是一件很好的事情。這是一項清理歷史的行動,使其他人更容易閱讀。在這種情況下,刪除一個錯誤的提交,以便其他人不必讀取它。 –

+0

@KlasMellbourn,是的,我一直這樣做。但我總是想起斯大林時代照片中的人們正在消失...... – vonbrand