一个奇怪的git问题,求大家帮忙分析一下?

比如我现在在工作区新建一个文件叫test.html,然后git status:
cc9c1f9d622e1b4d375a901554e8f5ee_b.png
git检测到这个新添加的文件,提示通过add加入暂存区。
下面执行:
git reset --hard
貌似没有执行什么,再看git status:
91b3af8f978838a3ba6e3597e2dc13c5_b.png
还是刚添加文件时的git status提示,新添加的test.html没有被删除。
58fde6e68308816be30e344bc2e361d9_b.png
现在执行:
git add dist/test.html
在查看git status状态:
ac2c7c43cbb53429174497604199299e_b.png
新添加的test.html放入暂存区,下面执行:
git reset --hard
再看git status,工作区和暂存区全部干净了,新添加的test.html也没有了。
9ce2ff9afb057f9cf7075cb3485c566e_b.png
总结下两次操作的区别:
同样是新建了一个test.html文件
第一种是直接git reset --hard,新建test.html文件在工作区被保留
第二种是先add这个新建test.html文件,被添加到暂存区,然后git reset --hard,工作区的test.html文件也被删除了。
如果git reset --hard是拿上次提交的记录来覆盖工作区和暂存区的话,那么第一种情况时,test.html就应该被删除。如果是git reset --hard不对没有被追踪的文件进行处理的话,第二种情况下,test.html在工作区不会被删除。
自己已经晕了,等git来解答,我觉着这很可能是git的一个bug。

阅读 2.5k
3 个回答

git reset --hard 就是将暂存区和工作区的内容都重置成HEAD所指向的版本。
所以第二种情况下,你暂存区和工作区的test.html都没了。
至于第一种情况,你仔细看第一张图片,里面显示test.html为Untracked file,也就是说该文件没有被追踪,所以当然不会被删除了。

Stage Area/Index Area(缓存区)

====================================

Working Area(工作区)

====================================

Untracking Area(未追踪文件,即新建文件)

git reset 影响的是 Stage 和 Working 两个区域(你自己都说了),所以不是 Git 有 bug,而是你没有理解基础概念。

1.暂存区撤销 git reset 不要--hard试试
2.工作区撤销用git checkout

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏