之前讲过,Git
版本库在工作区根目录下的 .git
目录,如果不小心删除了工作区,版本库也会一并被删除,一个项目仅在一个工作区进行维护太危险了。为了更好地避免这个问题,将学习使用 git clone
命令建立版本库克隆,以及使用 git push
和 git Pull
命令实现克隆版本之间的数据同步。
命令 git clone
的三种用法:
-
git clone {repository} {directory}
将
repository
指向的版本库克隆到directory
目录,会将整个工作区都检出,包括.git
目录。 -
git clone --bare {repository} {directory.git}
只检出版本库 ,不包含工作区,称为裸版本库,目录名通常以
.git
为后缀。 -
git clone --mirror {repository} {directory.git}
跟第二种用法一样。但是,会对上游版本库进行注册,可通过
git fetch
命令和上游版本库进行持续同步。
命令 git push / pull
的用法:git push/pull {remote-repos} {refspec}
其中花括号的含义是参数可以省略,remote-repos
是远程版本库的地址或名称,refspec
是引用表达式。
用法一演示:
- 执行克隆命令,把
demo
目录克隆到demo-backup
目录:
- 进入
demo
版本库,生成一些测试提交,使用--allow-empty
参数允许生成空提交。
- 进行同步处理,在
demo-backup
中进行git pull
:
可以看到,demo
版本库中的提交已经被拉回到 demo-backup
版本库了。我们只是执行了 git pull
命令,就能同步 demo
中的提交,这是为什么呢?答案就在 git clone
命令,该命令会在克隆出来的版本库中对源版本库(上游版本库)进行注册,所以在 demo-backup
版本库中执行拉回操作,无须设置源版本库。
可以通过如下命令查看源版本库的注册信息:
实际上,注册源版本库的奥秘就在 Git
的配置文件中 :
关于配置文件中的 remote
和 branch
,在后面章节再进行详细的讲解。
很显然,在 demo
的配置文件中是没有 remote
和 branch
的配置项的,所以 demo
不能直接通过 git pull
来同步 demo-backup
中的提交,要指定路径 :git pull ../demo-backup
。具体操作就不演示了。
用法二演示(使用 --bare 参数):
- 从
demo
版本库克隆裸版本库到repos/demo.git
目录中,克隆出来的只有版本库目录,不包含工作区,如下:
- 查看一下该裸版本库的配置文件 :
单独查看某个配置项,可以这样: git config core.bare
- 进入
demo
版本库,生成一些测试提交:
- 直接在
demo
版本库向demo.git
推送,无须在demo.git
进行git pull
操作(实际上也无法执行git pull
操作,因为没有工作区):
推送成功(第一次推送时)要加上 --set-upstream
或 -u
参数,将本地分支和远程分支进行关联,后续就不需要再指定远程分支了,直接 git push
即可。裸版本库会实时同步,不需要任何操作。
创建裸版本库的另一种方式(git init --bare
):
git init
初始化版本库时,默认是带工作区的,如果加上 --bare
参数,则以裸版本库的方式初始化版本库:git init --bare ../demo-init.git
根据目录内容和 core.bare
配置的值可以确定,就是裸版本库,没有任何提交内容。
现在,将 demo
的提交内容推送到 demo-init.git
,操作如下: