一般流程涉及的命令还好,到需要撤销操作的时候,就有点乱。所以,没有人提到 git reset HEAD -- file.ext 这个幽灵般的子命令吗?
使用此命令,可以把 file.ext 移除暂存区。可是为什么不是 git unstage file.ext 呢。
命名应该体现语义, unstage 就是体现了语义的,在 pro git 一书中也建议通过自定义命令的方法,定义一个 unstage ,替代 reset 在此场景下的使用。 git reset HEAD -- file.ext 则是体现了它的实现。你要明白 reset 子命令是从 HEAD 之内取出 file.ext,使用此文件复写暂存区文件,从而达成把已经暂存的文件恢复成前一个版本的效果。为此,你就需要弄明白三个树的存储结构。等到钻入这个黑洞。我明白时,我已经把 tree 的三种存储搞清楚了。我就是这样任性的向偶像致敬的。
OMG ,为了连接 SQL ,你得弄明白关系数据库的存储——就是这个意思。
仿佛还不够复杂,于是还有:
1. git reset --hard HEAD
2. git reset --soft HEAD
3. git reset --mixed HEAD
可是在偶像目前,我不敢乱讲话的。所以,你不妨看看:
git reset
http://stackoverflow.com/questions/4114095/revert-git-repo-to-a-previous-commit?lq=1原来并非我不懂。我不是一个人在战斗。
pro git 的作者也说,第一版本我没有说 reset ,是因为,我也不懂。妈蛋,把 git 这么个命令行版本工具写的和 c++ primer 差不多厚的人说我其实写完了一本书也不懂 reset 的。
另外, git add 是有多含义的,对于未跟踪的文件,可以用 add 把它变成已跟踪并且加入暂存区。对于修改的文件,可以用 add 加入暂存区。不同的场景功能是不同的。那么如何把一个未跟踪文件变成(仅仅变成已跟踪呢?我没有看到。 unix 的哲学是单一功能的命令,组合使用。一个多功能的命令未必合适。
我的意思:我对 CLi 的设计略有微词。也许我有些地方没有弄明白,请明白人指正。内部存储、暂存、分支、合并、 rebase 都很好的。