帮助理解的
从觉得说的清晰的拿来,我也是很方。
hello 工作区hello 缓存区空
hello world 工作区hello world缓存区空
git add 工作区hello world 缓存区helloword
hello world123 工作区hello world123 缓存区helloword
git commit 工作区hello world123 缓存区helloword 提交到git helloword
应该把rm \和add看成是一种对应的命令
① 修改后 未add(添加到暂存区) 需要撤销修改时:
git checkout -- myfile.txt 或 手动删除工作区修改 工作区 : clean 暂存区: clean
② 修改后 add了(未commit) 再次修改文件 要撤销第二次修改时:
git checkout -- myfile.txt (将暂存区恢复到工作区) 暂存区有第一次的修改需要commit
③ 修改后 add了(未commit),需要撤销修改时:
git reset HEAD myfile.txt (将暂存区修改删除) 此时工作区的修改还未撤销 git checkout -- myfile.txt (撤销工作区修改)
④ 修改后 add并commit了,需要撤销修改时:
git reset --hard HEAD^ (版本回退)**
git reset HEAD filename 是用master里最新文件(也就是head指向的文件)覆盖 stage 的文件。
git checkout 是用 stage 的文件覆盖 工作区的文件。如果stage文件已经commit 到 master,则相当于用master 文件覆盖工作区文件。
1).从工作目录,提交到stage。2).从stage提交到master。
从工作目录提交到stage,需要用add或者rm命令,只提交到stage,而没有提交到master,是不会自动同步到master的。
从stage提交到master用commit命令。
退回也是要分两步,一个是从master退回到stage,然后再从stage退回到工作目录。
对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。
对于已经到达stage的,想把state中的文件状态用master中的覆盖掉,就用reset命令,这样就把stage中修改用master的状态覆盖掉了
假定HEAD版本为版本1
1、工作区你修改了,为 版本2 ,但没add,那么 checkout 就会使你工作区回到版本1
2、工作区你修改了,为版本2,add了,stage区也为版本2,然后你又修改了工作区,为版本3,没再次add,那么checkout就会使你stage区的版本2失效,理解为清空也行,但是工作区依然版本3