簡體   English   中英

我可以返回並從以前的 git 提交中刪除特定文件嗎?

[英]Can I go back and remove particular files from previous git commits?

我的項目中有 5 個文件。 我已經完成了 10 次提交,在每次提交中,我修改並暫存了每個文件。 是否可以更改每個提交以包含這 5 個文件中的第一個之外的所有文件?

是的,這是不可能的。 我會給你四種重寫歷史記錄的方法,以從中刪除文件......

⚠️ 如果出於安全原因需要從 git 歷史記錄中刪除文件,則應按照從 Git 歷史記錄刪除敏感文件及其提交中的步驟操作。

交互式變基

如果您還不是 git pro,我建議您使用此方法,即使有更多手動步驟。

既然你想重寫 10 個提交,你可以這樣做:

git rebase -i HEAD~10

這將打開一個“待辦事項列表”,它將列出從HEAD~10開始的提交,這將是最后 10 次提交。 如果您保留文件並關閉它, git rebase將按照顯示的順序重放這 10 次提交,並且不會有任何更改。 但是通過編輯待辦事項列表,您可以完全控制發生的事情。 您可以重新排序任何行,從而重新排序提交。 您可以刪除一行或用skip替換pickskip提交。 或者您可以用另一條指令替換“pick”。 所有這些都在 todo 文件本身中進行了解釋,因此您不必記住所有選項。

在您的情況下,您希望修改每個提交以刪除一個文件。 edit或只是e替換每個pick 關閉文件。 Git rebase 然后會重放這些提交,但會在每次提交后停止並允許您修改它。

在第一個上,您將git rm要刪除的文件,然后git commit --amend 新的第一次提交將不再包含該文件。 您現在可以繼續下一個。

ℹ️ 在交互式 rebase 期間,您始終可以輸入git status ,它會向您顯示 rebase 的當前狀態,並提示您下一步可能想要做什么。

繼續下一次提交: git rebase --continue Rebase 將嘗試重放下一次提交,但會因沖突而停止:在您的新重寫分支上,該文件不再存在,但在正在重放的第二次提交中,該文件已被修改。

在這種情況下,您只需再次刪除文件然后git add .解決沖突git add . 使用此選擇的沖突解決方法更新暫存索引。 然后git rebase --continue告訴 rebase 重試提交第二次提交,然后繼續進行第三次提交。

ℹ️ 如果在任何時候您認為自己犯了錯誤,或者改變了主意,請運行git rebase --abort ,一切都會恢復到您之前的狀態。

對於所有剩余的提交,相同的沖突將再次發生,並且您對所有提交都執行相同的操作:

  • 刪除文件
  • git add . 記錄你的決心
  • git rebase --continue繼續前進。

當 rebase 完成后,您當前的分支HEAD現在將指向一個新的 10 個提交系列,而沒有您想要刪除的文件。 原始提交仍然存在,但如果沒有引用指向它們,它們最終將從 git 數據庫中刪除。

將 10 個提交壓縮為一個沒有文件的提交

如果您將 10 個提交壓縮為 1,則可以跳過修改它們。如果您不需要歷史記錄來反映 10 個單獨的編輯,如果您不關心歷史是否只有一個包含所有組合更改的提交,那么這個是給你的票:

git reset HEAD~10

這會將當前分支的HEAD移回 10 個提交。 您在這 10 次提交中所做的所有更改仍將在工作樹中,但不再提交到 git 中。 您現在可以刪除不需要的文件和git add . 剩下的,然后提交。 或者,如果您不想刪除文件,只需將其保留在 git 之外,只需git add <the other 9 files>並提交即可。

git 過濾器分支

這是高級用戶方式。 它更加自動化。 但我建議所有非 git-guru 使用上面的git rebase ,因為這是成為大師的好方法。

filter-branchgit 文檔有從每次提交中刪除文件的說明,所以只需遵循這些說明。

git-filter-repo

我從未使用過git-filter-repo (還),但它非常推薦(顯然是 git 維護者)。 它本質上是一個對用戶更友好的git filter-branch版本。 @LeGEC 在評論中提供了特定的命令,所以我在這里添加它:

git filter-repo --invert-paths --path file/to/ignore

祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM