Git管理修改和撤销修改
管理修改:
现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
为什么说Git管理的是修改,而不是文件呢?我们还是做实验。第一步,对readme.txt做一个修改,比如加一行内容:
添加内容:Git tracks changes. 并add
此时我们再次修改readme,添加内容:Git tracks changes of files.
提交:
提交提示成功了,但是我们在使用git status查看的时候,发现第二次的修改并没有提交上去,如果提交上去了的话,这里应该返回tree clean的!
好,我们回顾下整个流程:
第一次修改 -> git add -> 第二次修改 -> git commit
你看,我们前面讲了,Git管理的是修改,当提交在工作区的第一次修改被放入暂存区,但是,你用git add命令后,在工作区的第一次修改被放入暂存区,准备在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:
这里可以看到,第二次的修改确实没有提交上去。
那么如何提交上去呢?
你可以继续 git add再 git commit
也可以别急着提交第一次,先 git add,把两次修改同时添加到暂存区,再一次git commit
撤销修改:
我们现在看下,如果不小心在文件中编辑了不该出现的字段,而且又记不得自己加了哪些~如何撤销自己的本次修改呢?
这里要分为三种情况:
1:文件只在工作区,没有add也没有commit!
2:文件再暂存区,add了,但是没有commit!
3:文件add了,也commit了!
下面针对这三种情况,分别看看改如何解决:
直接上指令了!
我们在readme文件的最后面添加了一句脏话,现在想撤销这句话!
此时我们没有add,也没有commit!
这里我们看到,git checkout指令,就是把对应文件的本次修改撤销的指令!注意,这里的‘--’不能省略,不然就是切换分支的指令了!
第二种情况:文件add了,但是没有commit
这里看到,修改已经被add到暂存区了!
此时,执行指令
git reset HEAD readme.md
这里看到,在执行了git reset HEAD readme.md 之后,暂存区的修改就悲哀还原到工作区了,那么工作区的话,就继续执行第一种情况的操作即撤销修改!
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本,版本库中最新的版本,不是你瞎几把修改的那个最新版本!
第三种情况:add了!commit到本地版本库了!
这种情况也好解决,还记得另一篇文章中的穿梭版本吗?他可以是你能够调整到任意你想要的版本!
通过git log 或者 git reflog
找到对应版本的commit ID!
git reset --hard commitID
第四种情况~
为什么还有第四种情况?就是你把本地版本库push到了remote~此时,也别做撤销了,准备扣工资吧~因为git是分布式存贮的~不好解决!
不过我这里有个想法,重新编辑文件,add、commit、push,这样的话,远程的库不也就被我修改了~至少不会让老板那么容易的发现那些脏话!
没问题的吧~
以上,共勉!