問題:
在Git提交版本,有時有些小版本相比較于后續的大版本,都會包含,且后續存在的意義不太大,一般認為是可以刪除的。或者,中間一些版本有問題但是也提交了,拉取這些版本根本沒用,這些版本也可以或者應該刪除。那么,怎么刪除指定版本呢?刪除后Git版本流會是什么樣的結構呢?
下面是查到的一些方法:
1、使用git revert
以下來自百度文心快碼。部分文字可能有些不通。
git revert命令詳解?
git revert是一個Git命令,用于撤銷一些現有的提交,并記錄一些新的提交以反映這些更改的撤銷。它不是從項目歷史記錄中刪除提交,而是通過創建相反內容的新提交來撤銷指定的更改,這有助于維護修訂歷史記錄的完整性。
?一、基本語法?
bash
git revert <commit>...
這里的<commit>是你想要撤銷的提交的哈希值或引用,你可以指定一個或多個提交。
?二、常見用法?
- ?撤銷最新提交?
bash
git revert HEAD
這會撤銷你最近的提交,并創建一個新的提交來反映這一撤銷。
- ?撤銷前一次提交?
bash
git revert HEAD^
HEAD^表示上一次提交,所以這條命令會撤銷上一次提交。
- ?撤銷多個連續的提交?
如果你想要撤銷多個連續的提交,可以使用以下命令:
bash
git revert commit_id_start..commit_id_end
這里commit_id_start是你想要開始撤銷的提交的哈希值,commit_id_end是你想要結束撤銷的提交的哈希值(不包括這個提交本身)。注意,這個范圍是左閉右開的。
如果你想要撤銷多個不連續的提交,你需要為每個提交分別執行git revert命令。
?三、選項?
- --edit?或?-e:允許你在提交撤銷更改之前編輯提交消息。默認情況下,這個選項是啟用的,除非你使用了--no-edit選項。
- --mainline parent-number?或?-m parent-number:當你處理一個具有多個父提交的提交(例如,由git merge創建的合并提交)時,這個選項允許你指定哪個父提交應該被視為主線。
?四、注意事項?
- 在執行git revert之前,請確保你的工作目錄是干凈的,即沒有未提交的更改。
- git revert會創建一個新的提交來撤銷先前的更改,所以你的提交歷史會保留下來。
- 如果你想要丟棄工作目錄中的所有未提交更改,應該使用git reset命令,特別是--hard選項。但是請注意,這將會改變你的提交歷史。
?五、示例?
假設你有以下的提交歷史:
text
* abc1234 (HEAD -> master) Merge feature-branch into master
* d7e6b2d (feature-branch) Add new feature
* 3a6c0f2 (master) Initial commit
其中,abc1234是一個合并提交,feature-branch被合并進了master。現在,你想撤銷這個合并提交,并希望保留master分支的變更,因此使用命令:
bash
git revert -m 1 abc1234
這個命令會創建一個新的提交,撤銷合并操作中的更改,實際上它將會恢復到abc1234合并之前的狀態,但歷史記錄仍會保留合并提交。新的提交將會與abc1234之后的提交一起繼續保留在歷史中。
小結:
? ? ? ? 個人感覺,revert的意思是回滾、恢復。并不是刪除,使用后即是回滾到指定版本之前的版本,只不過,回滾并不刪除指定版本及之后已經提交的版本在Git中的記錄?那么,這種回滾只適用于某個版本之后的版本后續可能不需要用的情況吧。而不是開篇問題提到的,只是將某個版本刪除,版本庫的最好這個版本記錄都沒有了,而且,其他的版本都不影響,即,這個版本之后提交的版本,依然按順序全部保留。
個人感覺revert不滿足要求。
2、DeepSeek給出的一種:
?使用?git filter-repo
?徹底清除提交
(適用于刪除含敏感信息的大文件或提交)
bash
# 安裝 git-filter-repo pip install git-filter-repo# 刪除指定提交(如 abc123) git filter-repo --invert-paths --commit abc123# 強制推送清理后的倉庫 git push origin --all --force
嘗試,沒效果。第一步安裝沒問題,第二步,報語法錯誤,不成功。第三步執行時,報不需要推送,沒有更新。回到遠程Git分支看,提交記錄確實沒有變化。
總結:
那么,是Git沒有這種操作么?不允許?還是沒找到辦法,未完,繼續探索中。