最近在看廖雪峰老师的Git教程,根据廖老师的教程,结合自己的理解和试验,总结一下Git三层的同步问题。
我们可以将Git分成三层,分别是工作区(workstation),暂存区(stage),版本库(master)。工作区就是本地的工作目录,暂存区是中间一层暂存修改的抽象层次,版本库就是最终的版本控制层次。
工作区 à 暂存区 à 版本库
首先,工作区的新建文件、修改文件以及删除文件都可以在本地电脑上直接进行。
工作区与暂存区之间的同步:
暂存区同步成工作区版本分两种情况,
1、工作区新建或者修改了文件
gitadd filename
2、工作区删除了文件
gitrm filename
经过上面,就使得暂存区中的版本同步成了与工作区相同的版本。
若想让工作区同步成暂存区的版本呢?或者可以称之为回退。
gitcheckout -- filename
这使得工作区同步成了暂存区的版本。
暂存区与版本库之间的同步:
若想将版本库同步成与暂存区相同的版本,只需要git commit –m “string”即可。
若想将暂存区同步成与版本库相同的版本,或称之为回退,git reset HEAD filename。
版本库这一层次上也可以进行版本回退。比如我们想将版本库中当前版本回退到上一个版本,可以git reset --hard HEAD^。
理清楚上面这些关系,就可以结合实现工作区、暂存区、版本库各自层次以及层次之间的同步回退等操作。
下面用一个例子来说明一下。
(1)
首先在工作区新建一个文件world.txt,为版本A。
然后add到暂存区后马上commit到版本库。
此时,工作区、暂存区以及版本库里都是版本A。
(2)
工作区中修改world.txt文件,为版本B。
然后add到暂存区后马上commit到版本库。
此时,工作区、暂存区、版本库里都是版本B。
(3)
工作区中修改world.txt,为版本C。
然后只add到暂存区而不commit到版本库。
此时,工作区与暂存区里都是版本C,而版本库里是版本B。
(4)
工作区里修改world.txt,为版本D。
此时工作区里版本D,暂存区里版本C,版本库里版本B。
上面的这四步操作和四个版本作为前提,下面就进行三个层次四个版本的同步。
如果以版本库为对象,此时版本库中是B版本,
若想让其成为A版本,可以进行版本回退,回退到上一个版本即版本A。
如果想让其同步成版本C,只需要commit一下。
如果想让其同步成版本D,则先add一下,然后commit一下。
如果以暂存区为对象,此时暂存区为C版本,
若想让其成为D版本,只需要add一下即可。
若想让其成为B版本,需要回退,reset一下。
若想让其成为A版本,需要先将版本库回退到版本A,然后暂存区reset成版本库当前版本。
如果以工作区为对象,此时工作区为D版本,
若想让其成为C版本,checkout一下即可。
若想让其成为B版本,先将暂存区reset成B版本,在checkout一下。
若想让其成为A版本,先将版本库回退到版本A,再将暂存区reset成版本库当前版本即版本A,然后checkout一下。
整理一个状态转换图,如下: