2015-06-24 114 views
0

我見過很多相關的討論,但並不是我的特定問題的確切解決方案。我想刪除特定文件的歷史記錄中的一個步驟。Git刪除文件歷史記錄中的一步

因此,例如,我添加一個文件「Foo.txt」。我承諾我的更改。然後我修改了一堆文件。我再次承諾。現在,我想將「Foo.txt」還原爲較早的提交,並刪除更改的歷史記錄。

我知道命令

git checkout "aasdfasdfad" Foo.txt 

將恢復foo.txt的狀態到任何它在提交「aasdfasdfad」。然而,git的還有「foo.txt的」在其狀態之前的版本,不知何故。我如何知道這一點?因爲在我的情況下,「Foo.txt」的大小從幾個字節變成了兆字節。所以當我恢復到早期版本時,我的.git目錄的大小應該減少大約一兆字節,但它不會改變。

不知怎的,我要告訴混帳,我不僅要恢復到foo.txt的早期版本,但我想從那時起扔掉所有更改foo.txt的。

[後來補充] 只是爲了絕對清楚我想要做的,讓我給一個非常特殊的情況:

  1. [創建文件foo.txt的。現在,它是1KB大小]
  2. 混帳添加foo.txt的
  3. [創建文件跳回到bar.txt]
  4. git的加跳回到bar.txt
  5. git的承諾-m 「小檔案」
  6. [修改foo.txt。現在是1GB大小]
  7. 混帳添加foo.txt的
  8. [修改跳回到bar.txt]
  9. git的加跳回到bar.txt
  10. git的承諾-m 「大文件」

此時,我想將foo.txt重置爲它在步驟3之後的狀態。但是我希望bar.txt具有它在步驟8之後的狀態。所以我希望文件和歷史記錄看起來像好像我從來沒有做過第6步和第7步

回答

0

首先,我假設你知道黨重寫git歷史記錄 - 簡而言之,如果您已經將違規提交推送到服務器並且您有其他人正在處理該項目,則不希望這樣做。

這就是說,你會想要做到以下幾點。根據您的意願製作foo.txt的副本(例如,它是如何在aasdfasdfad中)。然後做一個git rebase -I aasdfasdfad。這將帶來一個提交列表的編輯器。對於每個修改了foo.txt的文件,將其操作從「pick」更改爲「edit」。保存並關閉您的編輯器。現在,每次git暫停rebase以允許您編輯提交時,將foo.txt的「good」版本複製到您的工作目錄(即覆蓋git「知道」的那個)。然後git commit --amend,git rebase --continue,並重復,直到rebase完成。

注意,直到垃圾收集,您的.git目錄可能仍然相當大。

+0

非常感謝!我會試試看。是的,我知道推動變化,而這正是我想要這樣做的確切原因。我不想在服務器上放置一個巨大的文件,因爲它與未來的發展無關。 如果我能問一個後續問題,有沒有辦法做一個非交互式的rebase?我不想詳細說明我在做什麼,但我會從bash腳本中調用git,而不是從命令行調用。我不希望它是互動的。 –

+0

如果是這樣的話,你可能想看看'git filter-branch',它爲每次提交運行腳本一次。其參考資料位於http://git-scm.com/docs/git-filter-branch,並在https://git-scm.com/book/en/v2/Git-工具重寫-歷史。 –

相關問題