我見過很多相關的討論,但並不是我的特定問題的確切解決方案。我想刪除特定文件的歷史記錄中的一個步驟。Git刪除文件歷史記錄中的一步
因此,例如,我添加一個文件「Foo.txt」。我承諾我的更改。然後我修改了一堆文件。我再次承諾。現在,我想將「Foo.txt」還原爲較早的提交,並刪除更改的歷史記錄。
我知道命令
git checkout "aasdfasdfad" Foo.txt
將恢復foo.txt的狀態到任何它在提交「aasdfasdfad」。然而,git的還有「foo.txt的」在其狀態之前的版本,不知何故。我如何知道這一點?因爲在我的情況下,「Foo.txt」的大小從幾個字節變成了兆字節。所以當我恢復到早期版本時,我的.git目錄的大小應該減少大約一兆字節,但它不會改變。
不知怎的,我要告訴混帳,我不僅要恢復到foo.txt的早期版本,但我想從那時起扔掉所有更改foo.txt的。
[後來補充] 只是爲了絕對清楚我想要做的,讓我給一個非常特殊的情況:
- [創建文件foo.txt的。現在,它是1KB大小]
- 混帳添加foo.txt的
- [創建文件跳回到bar.txt]
- git的加跳回到bar.txt
- git的承諾-m 「小檔案」
- [修改foo.txt。現在是1GB大小]
- 混帳添加foo.txt的
- [修改跳回到bar.txt]
- git的加跳回到bar.txt
- git的承諾-m 「大文件」
此時,我想將foo.txt重置爲它在步驟3之後的狀態。但是我希望bar.txt具有它在步驟8之後的狀態。所以我希望文件和歷史記錄看起來像好像我從來沒有做過第6步和第7步
非常感謝!我會試試看。是的,我知道推動變化,而這正是我想要這樣做的確切原因。我不想在服務器上放置一個巨大的文件,因爲它與未來的發展無關。 如果我能問一個後續問題,有沒有辦法做一個非交互式的rebase?我不想詳細說明我在做什麼,但我會從bash腳本中調用git,而不是從命令行調用。我不希望它是互動的。 –
如果是這樣的話,你可能想看看'git filter-branch',它爲每次提交運行腳本一次。其參考資料位於http://git-scm.com/docs/git-filter-branch,並在https://git-scm.com/book/en/v2/Git-工具重寫-歷史。 –