網(wǎng)站開發(fā)的客戶群體淘寶新店怎么快速做起來
刪除遠端的歷史記錄但是不影響最新的倉庫內(nèi)容是筆者一直想實現(xiàn)的功能,有兩個很不錯的用處:
- 有的歷史提交不慎包含了比較敏感的信息,提交的時候沒注意,過了一段時間才發(fā)現(xiàn)。這個時候已經(jīng)有了很多新的歷史提交,無法再回退了。
- 有時候會拿Git倉庫存儲代碼文件以外的內(nèi)容,比如美術(shù)資源、依賴庫等等。這時除了少數(shù)提交大部分歷史提交是沒意義的,還很占倉庫空間。
不過要說明的是Git刪除歷史記錄跟我們想象中的不太一樣,需要使用的是rebase(變基)功能。這個功能對倉庫的改變還挺大的,以防外一我們還是先備份,然后創(chuàng)建一個分支:
git checkout -b cleanup-history
使用變基指令,重寫提交歷史,如下所示。
git rebase -i HEAD~n
-i
表示交互式重寫,會彈出一個包含所以歷史提交記錄的頁面讓你進行編輯。這里的n表示往前回溯n個版本。例如先檢查一下所有的歷史提交:
git rev-list --count HEAD
如果得到的數(shù)值是500,那么將n設(shè)置成499就可以看到所有的歷史記錄。有時候這個數(shù)值不對,可能是因為包含了合并的提交,那么可以試一下:
git rev-list --first-parent --count HEAD
或者:
git rev-list --count --no-merges HEAD
來大概估一下n的數(shù)值。當(dāng)然如果你回溯的歷史提交不太遠,給個大概能看到你要刪除的歷史提交即可。
在git rebase -i HEAD~n
之后在交互式頁面中,將需要刪除的歷史提交記錄的操作從pick改為drop。保存并退出編輯器,Git會開始重寫歷史,刪除指定的提交。有時候你想刪除的歷史提交太多,一個一個改成drop很麻煩,可以使用NotePad3這樣的文本工具,通過列選取功能來批量修改。
如果你刪除的歷史記錄足夠遠足夠多,接下來你就會看到比較揪心的一幕,你的Git代碼倉庫會回溯到最遠的歷史狀態(tài),然后逐步開始自動提交,這個過程很可能會出現(xiàn)一些問題。例如檢測到空提交,會提示并中止變基過程,可以進行跳過:
git rebase --skip
還可能會遇到?jīng)_突的問題,讓你解決沖突。如果是文件文件,就編輯后再git add xxx
;如果是二進制文件,要么刪除git rm xxx
,要么直接git add xxx
沖突的文件,然后繼續(xù)變基:
git rebase --continue
接下來如果一路順利,就將改動強制推送到遠程分支:
git push origin cleanup-history --force
最后,檢查一下分支的歷史提交內(nèi)容,沒有問題的話將這個分支替換為主分支:
git checkout main
git reset --hard cleanup-history
git push origin main --force
如果想徹底清除這些提交記錄,并壓縮Git倉庫的體積,所以可以使用了如下指令:
git reflog expire --expire=now --all
git gc --prune=now --aggressive
對于其他用戶,可以使用如下指令進行更新:
git pull -rebase origin main
在筆者實際的使用過程中,遇到的沖突問題非常多,經(jīng)常要停下來解決沖突的問題。筆者也不太理解為什么刪除歷史記錄還要解決與當(dāng)前倉庫快照沖突的問題,猜測可能因為筆者的歷史提交記錄包含了很多合并的提交。因此這個方法對有的讀者可能不太適用,可能合并歷史提交、或者只保留最新提交的版本更合理一點。