我在GitHub上合併了一個pull請求。但是,這是一個錯誤,我想撤銷合併,提交,最重要的是,從歷史記錄中刪除由這幾個提交引入的所有文件。如何完全刪除合併的拉取請求?
我恢復了與另一個提交,它的工作,但文件仍然在提交歷史記錄(他們很大),這將是很好,如果提交本身消失。
我試圖過濾分支刪除文件,但它似乎沒有收縮存儲庫大小(和提交仍然存在)。
我該怎麼辦?
我在GitHub上合併了一個pull請求。但是,這是一個錯誤,我想撤銷合併,提交,最重要的是,從歷史記錄中刪除由這幾個提交引入的所有文件。如何完全刪除合併的拉取請求?
我恢復了與另一個提交,它的工作,但文件仍然在提交歷史記錄(他們很大),這將是很好,如果提交本身消失。
我試圖過濾分支刪除文件,但它似乎沒有收縮存儲庫大小(和提交仍然存在)。
我該怎麼辦?
使用樹狀過濾器或索引過濾器不起作用。硬復位和重新包裝也沒有。
這裏是什麼工作:
git checkout <commit>
git push --force origin HEAD:master
現在我很好奇,爲什麼這些解決方案沒有奏效。我正在使用git count-objects -v
中的尺寸包進行檢查。它是否正確?我應該立即看到尺寸縮小還是僅在推出後才能看到尺寸縮小?
恢復提交不會從歷史記錄中刪除文件。
如果你想不僅在當前HEAD不存在的,而且要從來沒有在所有存在的文件,git revert
是不是適合你的命令。您需要運行一個filter-branch
以完全刪除這些文件。
你說你已經這樣做了,但你沒有告訴我們如何;如果你正確地做到以下幾點:
git filter-branch --tree-filter
刪除文件git reflog expire --expire={1 second}
rm -rf .git/refs/original
git gc
... 然後庫應該收縮。你需要最後三個步驟,因爲(按順序):
filter-branch
,直到你運行一個垃圾收集存儲在refs/original
如果你只是想刪除合併和它相關的提交,使用git reset --hard
:
git reset --hard <commit before merge>
請注意,這會破壞當前HEAD中未提交的任何更改。它也將刪除合併後發生的所有提交(所以也許你最好使用git rebase)。
重置您的分支後,強制推動它,使新的歷史持久。
免責聲明:重寫已發佈的歷史記錄是個不好的做法。不要這樣做,如果你不需要的話。
不幸的是我必須:( – Allan
如@knittl描述
git reset --hard <sha1>
刪除合併和提交。但是,除非刪除關聯的懸掛對象,否則將不會看到存儲庫大小的任何更改。您還需要通過例如保留對這些對象的引用來終止reflog。
git reflog expire --expire-unreachable=now --all
git prune
git repack -a -d
我想刪除一個文件夾。我試過: git filter-branch --tree-filter'git rm -r --cached --ignore-unmatch badFolder'; git reflog expire --expire = now; rm -rf .git/refs/original; git gc; //然後:git count-objects -v;但大小包沒有下降。 – Allan
@Allan如果您使用的是'git rm'命令,您可能需要'git filter-branch --index-filter'而不是'git filter-branch --tree-filter'。 – Borealid
@Borealid您的解決方案仍然有一些漏洞 - 使用'git reflog expire --expire = now --all'來清理所有reflog(每個分支都有一個reflog,並且在不同的分支中可能還有指針),而不是'git gc',運行'git repack -Ad; git prune --expire = now'('git gc'不會從現有的pack文件中刪除懸掛的對象,'repack'是必要的)。 – twalberg