如何从已推送到远程仓库的Git提交中移除指定文件?
移除Git历史中误加的文件
如果你只是想让未来提交不再包含MYFILE,但允许历史记录里保留它,操作很简单:
- 先删除本地文件:
git rm MYFILE - 提交修改:
git commit -m "移除MYFILE文件"
但如果要彻底从所有历史提交里删掉这个文件,按以下步骤来(适合仓库还没推送给其他人的情况,要是已经推送,看后面的注意事项):
- 先确认当前工作区没有未提交的修改,执行
git status检查,有修改就先提交或暂存。 - 执行下面的命令,遍历所有提交移除MYFILE:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch MYFILE' --prune-empty --tag-name-filter cat -- --all
这个命令会在每个提交的索引里移除MYFILE,--ignore-unmatch是防止某些提交里没有这个文件时报错,--prune-empty会自动删掉因为移除文件后变成空的提交。
3. 清理Git生成的冗余数据:
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin git reflog expire --expire=now --all git gc --prune=now
注意事项
- 如果你的仓库已经推送到远程服务器,执行完上面的操作后需要强制推送:
git push --force --all。但强制推送会改写远程仓库的历史,如果有其他同事在使用这个仓库,一定要提前和他们沟通,让他们重新拉取并处理本地的历史记录,否则会出现冲突。
内容的提问来源于stack exchange,提问作者nobody
相关产品推荐
相关产品推荐

