2014-04-20 206 views
2

我發現一年前我有一個文件承諾回到我的回購站,而我從來不想去那裏。 在我公開發布我的repo之前,我想要還原或實際刪除引入此文件的提交,以便任何人都無法訪問此文件。從git歷史記錄中刪除提交

我用過交互式rebase,所以我可以刪除不需要的提交。它看起來很有前途,但是在應用800次800次提交之後,就會發生衝突。

衝突是由非線性歷史造成的 - 在兩個分支中都有一個分支和一個文件被修改(讓我們說feature1和feature2)。據我注意到git rebase試圖使這個平行歷史線性,並在這些平行,相互衝突的修改失敗。我不想嘗試解決這個問題,因爲還有更多這樣的情況,並且修復所有這些問題將是一個很大的努力。

所以我的問題是:是否有可能簡單地刪除一個提交重建分支歷史沒有任何影響其他提交?

我的文件被添加了一次,從未被修改,所以沒有其他提交觸摸它。

+2

相關:[從Git歷史記錄中刪除敏感文件及其提交](http://stackoverflow.com/q/872565/456814),[如何從Git存儲庫中的提交歷史中刪除/刪除大文件?](http://stackoverflow.com/q/2100907/456814),[從所有Git存儲庫提交歷史中完全刪除文件](http://stackoverflow.com/q/307828/456814),[從git中刪除文件資源庫(歷史)](http://stackoverflow.com/q/2164581/456814)。 –

+0

默認情況下,'git rebase'不保留合併提交。但是,[您可以通過使用' - '來告訴 它嘗試保留合併提交](https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html#_options) preserve-merges'或 '-p'標誌。我不確定這是否會重新應用先前提出的衝突解決方案。 –

回答

2

你可以試試filter-branch命令。

git filter-branch --prune-empty --tree-filter 'rm <filename-to-delete> || true' HEAD 

如果錯誤提交剛剛添加的文件刪除,整個提交將被跳過(選項--prune空)。

我已經用一個分支和合並的簡單回購測試了這個,並且合併很巧妙地保留了下來。所以你不應該期待衝突。先生,filter-branch也創建了一個備份分支。 :-)

相關問題