Git执行commit时自动包含未跟踪文件是什么原因?该如何解决?
问题原因
按照Git的默认逻辑,未跟踪文件不会被git commit命令默认提交,出现你描述的情况,通常是以下几种原因:
- 查看
git status之后、执行提交操作前,你无意中执行了git add abc、git add .或git add *这类命令,将abc文件加入了暂存区,未再次核对状态就直接执行了提交。 - 仓库配置了自定义
pre-commit钩子,钩子脚本中包含自动添加未跟踪文件到暂存区的逻辑,提交时自动把abc加入了提交范围。 - abc文件此前曾被提交到仓库,后续你仅从暂存区移除了该文件但未删除本地副本,后续操作中又被重新加入了暂存区。
你执行git clean -f abc没有效果,是因为该命令仅会删除本地未跟踪的文件,已经加入暂存区的文件不受该命令影响。
解决方法
修正已错误提交的记录
- 如果错误提交是当前分支最新提交,且尚未推送到远程仓库:
执行git reset --soft HEAD~1将提交内容回退到暂存区,再执行git rm --cached abc将abc从暂存区移除,最后执行git commit -m "my change"即可仅提交xyzzy的修改。 - 如果错误提交已经推送到远程仓库:
若仓库为多人协作场景不建议修改提交历史,可直接执行git rm abc删除该文件后提交修正记录git commit -m "remove accidentally committed file abc",再推送到远程即可。若确认无其他人拉取过该提交,可以回退本地提交修正后执行git push -f强制覆盖远程提交,该操作风险较高需谨慎使用。
避免后续再次出现误提交
- 每次执行
git commit前务必先执行git status核对暂存区内容,只有Changes to be committed列表中的内容会被提交。 - 检查仓库钩子配置,查看
.git/hooks/pre-commit文件是否存在自动添加未跟踪文件的逻辑,无需使用的钩子可直接删除对应文件。 - 不需要提交的本地文件可以添加到
.gitignore规则中,避免后续误操作加入暂存区。 - 确认无用的未跟踪文件可直接执行
rm abc删除本地副本,从根源避免误提交。
内容的提问来源于stack exchange,提问作者umop apisdn
相关产品推荐
相关产品推荐

