作者回复: 👍
作者回复: 嗯,说的有道理。 可能有一种情况需要吧,比如已经确定不想保留暂存区的变更,其次工作区还没有改好,我想把暂存区恢复到HEAD,以便执行 git diff就能比较工作区和暂存区(也等于HEAD)的差异。
作者回复: 好的,抓紧进度
作者回复: reset命令不加 --hard,则暂存区的内容恢复成HEAD对应的内容,工作区的变更继续保留。 如果加了 --hard,则不管工作区还是暂存区,内容都变回HEAD对应的内容。 大家可以多实践一下。 比较有意思的一个问题:暂存区一个readme文件,工作区对readme继续最变更,也就是工作区和暂存区的readme内容不一样了;请问:此时执行“git reset”命令,工作区的readme文件,可能会有哪几种情况?
作者回复: 很好的问题。 1)reset你用了hard参数 ,所以两个命令执行效果相同。注意reset命令的三个参数--hard, --mixed和--soft,除了hard外,你不妨用用其他两个方式再看看。 记住checkout会把暂存区的文件内容同步到工作区,咱们命令中又带上了HEAD,所以,会把HEAD对应的readme.md文件同步到暂存区和工作区。你不带 HEAD 再试试看吧 2)gitk只是好心提醒我们,有些改动的内容没加到暂存区(index),有些没创建commit
作者回复: 有收获,真好。
作者回复: 分情况思考一下: 1)最近一次commit想作废,也就是回到HEAD^(HEAD的父亲) 2)不是最近一次的并且只有一个父亲的commit怎么取消? 3)不是最近一次的并且有多个父亲的commit怎么取消? 第3)题稍微有点搞,暂时可以不考虑
作者回复: 你在ide里面执行commit后,再看看历史树是否生成了新的commit。如果是,你的理解就对了
作者回复: 啊? 工作区的修改如果就是你要的,那你不要 stash pop,直接创建commit就行了。 另外一种情况,可以先把当下工作区的变更用stash储藏起里,然后用git stash list看储藏区有多少次储藏(最新这次存在 stash@{0} 里面),最后用git stash pop stash@{某个数字}把对应的变更调出来。
作者回复: 嗯,可以拓展一下,把 reset 的几个参数用一下,--hard,--soft , --mixed ,看看有什么差别。 当然,请在测试环境用这些参数,--hard 是⚠️的,因为会把暂存区和工作区的变更都清除掉。