[英]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
替換pick
以skip
提交。 或者您可以用另一條指令替換“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 個提交壓縮為 1,則可以跳過修改它們。如果您不需要歷史記錄來反映 10 個單獨的編輯,如果您不關心歷史是否只有一個包含所有組合更改的提交,那么這個是給你的票:
git reset HEAD~10
這會將當前分支的HEAD
移回 10 個提交。 您在這 10 次提交中所做的所有更改仍將在工作樹中,但不再提交到 git 中。 您現在可以刪除不需要的文件和git add .
剩下的,然后提交。 或者,如果您不想刪除文件,只需將其保留在 git 之外,只需git add <the other 9 files>
並提交即可。
這是高級用戶方式。 它更加自動化。 但我建議所有非 git-guru 使用上面的git rebase
,因為這是成為大師的好方法。
filter-branch的git 文檔有從每次提交中刪除文件的說明,所以只需遵循這些說明。
我從未使用過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.