时光机穿梭
我们修改了readme的内容,是可以用git status
来查看仓库当前的状态的
当然我们还可以查看具体修改了哪些内容:git diff
在改了之后继续重复上面的操作,就可以把改过的内容重新提交上去了
版本回退
我们再修改一下:append GPL
现在我们有三个版本:1.wrote a readme file 2. add distributed 3. append GPL
当然我们在实际工作中脑子里不可能记住所有的改动,不然我们要版本控制系统干什么。
所以我们用git log
来查看我们的历史记录,如果觉得眼花缭乱,那么我们可以加上--pretty=oneline
的参数
首先我们要知道用HEAD
来表示当前的版本,上一个版本就是HEAD^
,再上一个版本就是HEAD^^
,那么我们现在就用git reset
来回退到上一个版本:git reset --hard HEAD^
这里的HEAD也可以用版本号来替代。
在穿梭前可以用git log来查看提交历史,以便确认要回退到哪个版本。
可以用git reflog
来查看命令历史
工作区和暂存区
工作区:我们在电脑中能看到的目录
版本库:repository,处于工作区的隐藏目录.git中。里面存放了很多东西,其中最重要的就是stage暂存区。还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
根据前面的内容中把文件添加进GIT版本库中的两个操作:
第一步add其实是把文件修改添加到暂存区;
第二步commit实际上就是把暂存区的所有内容提交到当前分支。
我们就可以理解成,需要提交的文件修改统统放到暂存区,然后一次性提交暂存区的所有修改。
管理修改
现在,假设已经完全掌握了暂存区的概念,下面我们要讨论的就是为什么Git比其他版本控制系统设计的游戏,因为Git跟踪的兵管理的是修改,而不是文件。
利用例子来解决这个问题。
首先我们先修改一遍readme.txt,然后在git bush中把这个版ADD了,在commit之前再修改一次readme.txt,这个时候再commit,结束之后输入git status
会发现我们的第二次修改并没有被提交。
我们第一次的操作:第一次修改 ---> add -----> 第二次修改 ------> commit。
我们前面说了,git管理的是修改,所以我们在使用了add命令之后这个修改被放到了暂存区(index)准备提交,但是在工作区的第二次修改并没有被放入了暂存区,所以在我们commit的时候只负责把暂存区的修改提交了。我们可以利用git diff HEAD -- readme.txt
来查看工作区和版本库里面最新版本的区别。
那我们该怎么提交第二次修改呢?我们可以继续git add git commit,当然也可以凑到一起
第一次修改 ---> add -----> 第二次修改 ------> add ------> commit。
撤销修改
当我们需要撤销工作区的文件的时候,我们可以用git checkout -- file
来丢弃工作区的修改。
但是这里有两种情况:
一种是readme.txt自从修改后还没有被放进暂存区,所以现在撤销修改就是回到和版本库一摸一样的状态。
一种是readme.txt已经被添加到暂存区了,但是我们又做了修改,现在,撤销修改之后就回到了添加到暂存区的状态
所以,可以总结说这个就是让文件回到最近一次git commit
或者git add
的状态。
在另一种情况下:我们已经add到暂存区了,但是还没有commit,我们就可以用git reset HEAD <file>
来把暂存区的修改来撤销掉。(unstage)
如果把它从暂存区提交到了版本库,可以利用版本回退。
0 条评论