为什么在RStudio中执行git提交时仅add单个文件却提交了全部文件?
问题原因分析
- 你之前执行的
git add .命令是问题的核心诱因:该命令会将当前Git仓库目录下所有未被.gitignore规则忽略的文件及变更全部加入暂存区,后续你执行git add test.Rmd只会将该文件的变更更新到暂存区,不会清空之前已经暂存的其他文件。 git commit操作默认会提交暂存区中所有的变更内容,而非仅提交最后一次git add的文件,因此你提交时包含了整个文件夹的文件,而非单独的test.Rmd。- 你之前在其他文件夹操作正常,是因为那些文件夹此前没有执行过
git add .这类批量暂存操作,暂存区为空,仅add单个文件后暂存区只有该文件,commit自然只会提交这一个内容。 - 你重复执行的
git init不会修改现有仓库的暂存区、提交记录,不会导致该问题。你怀疑的大文件未取消暂存的判断是正确的,git add .加入的所有内容只要没有手动取消暂存,会一直保留在暂存区,跟随每次commit提交。
修复方案
尚未执行push操作的情况
- 执行
git reset HEAD~回退最后一次提交,提交的所有内容会放回工作区,暂存区同时清空 - 执行
git add test.Rmd单独暂存目标文件 - 执行
git status确认暂存区仅包含test.Rmd - 执行
git commit -m "Adding some plots"重新提交 - 执行
git push推送到远程仓库即可
已经执行push操作的情况
如果是个人私有仓库,不需要保留误提交的记录:
- 执行
git reset --soft HEAD~回退最后一次提交,保留工作区所有文件内容 - 单独暂存test.Rmd后重新提交
- 执行
git push --force覆盖远程的误提交记录
注意:如果是多人协作的公共仓库,不要使用强制推送,建议额外提交一个删除误提交文件的 commit 即可。
后续避坑提示
- 每次执行
git commit前务必先执行git status查看待提交文件列表,确认和预期一致再执行提交 - 误暂存不需要的文件时,执行
git reset HEAD <文件名>可单独取消该文件的暂存,执行git reset HEAD可清空所有暂存内容 - 尽量不要直接使用
git add .批量暂存所有内容,可优先使用git add <目标文件名>按需暂存
内容的提问来源于stack exchange,提问作者MK Huda
相关产品推荐
相关产品推荐

