你可以 删除/重写之前的提交历史,达到清理 Git 大文件或者让仓库变小、去除敏感信息等效果。
注意! 这样做会重写历史 ,极度推荐提前备份,并且,如果此仓库有别人基于历史在开发,那么他们后续需要强制同步(git pull --force),否则会遇到大麻烦!
最常见的两种需求和方法
一、彻底删除所有历史,只保留最新版本(最暴力)
适合“我不在乎任何历史,只要最新本地内容(代码/结构/文件)”,极其干净。
操作如下:
1. 在本地新建一个临时分支,并删除除当前 HEAD 外所有提交历史:
git checkout --orphan latest_branch # 创建一个无任何历史的新分支
git add -A # 全部添加
git commit -m "init: clean history" # 新分支的第一次提交
2. 删除 master 分支,重命名新分支为 master
git branch -D master
git branch -m master
3. 强行覆盖推送到远程(慎用!远程历史会被替换)
git push -f origin master
警告: 其他协作者会因历史重写无法正常pull,需要重克隆或手动 rebase,协作者必须知情!
二、只删除大文件相关的历史(精细一点)
如果是为删大文件 ,而你又想保留历史,可以用 BFG Repo-Cleaner 或 git filter-repo
例如,官方推荐的 BFG:
假设你有个大文件叫 bigdata.csv 在历史中
# 先备份原仓库
cp -r yourrepo yourrepo.bak
cd yourrepo
# 下载 BFG : https://github.com/rtyley/bfg-repo-cleaner/releases
java -jar bfg.jar --delete-files bigdata.csv
# 清理后强制推送
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --force
详细用法见:
总结
- 可以删除历史,只保留最新,也可以定向清理大文件历史
- 最彻底的办法是
orphan分支法,新建一个分支提交当前所有代码,然后强推 - 一切操作前请备份!
- 不要忘了
.gitignore要及时配置好,避免新历史再次把大文件/不该追踪的文件加进来
“当前 .gitignore 里新加了需要忽略的大文件,如果我用 git add -A,会不会忽略这些大文件?”
简单结论
- 如果是 :还没被 Git 跟踪(从未被
git add/git commit过的文件 ),git add -A会遵守.gitignore,不会添加进暂存区(不会被 add 进去) 。 - 如果是 :之前已经
git add/git commit过,现在新加到.gitignore里的大文件 ,git add -A依然会把它们作为“修改”或“删除追踪”的对象 ,不会自动忽略,需要人为移除追踪(git rm --cached)。
举个例子
假设你项目里有个大文件 dataset/bigfile.csv,你现在加到 .gitignore:
dataset/bigfile.csv
情况一:bigfile.csv 从没被 add/commit 过
操作如下:
git add -A
不会被加进 git 包里,也不会提交到历史。
情况二:bigfile.csv 之前已经被 add/commit 过
只是后续你加到了 .gitignore ,再用
git add -A
还是会被 Git 继续“追踪”,不会自动忽略!
- 以后
git status会显示它(比如为“已修改”、“已删除”等) - 再 commit 还是会提交相关变更
想让已经被 Git 跟踪的这些文件也“被忽略”,需要怎么办?
正确做法:
- 加到
.gitignore - 移除 git 的追踪,但保留本地文件(注意这一步!)
git rm --cached 路径/文件
git add .gitignore
git commit -m "remove big data from tracking and update .gitignore"
这样才是彻底真正“忽略”。
总结
.gitignore只能影响“新添加”到 Git 的文件- 已经被 Git 跟踪的文件,要先用
git rm --cached移除追踪,再配合.gitignore才能真正忽略 - 之后
git add -A就会自动忽略这些文件

5520

被折叠的 条评论
为什么被折叠?



