赞
踩
用法1:git clone <repository> <directory>
用法2:git clone --bare <repository> <directory.git>
用法3:git clone --mirror <repository> <directory.git>
用法1 将 <repository> 指向的版本库创建一个克隆到<directory>目录。
目录<directory>相当于克隆版本库的工作区,文件都会检出,版本库位于工作区下的.git 目录中
用法2和用法3创建的克隆版本库都不包含工作区,直接就是版本库的内容,这样的版本库称为裸版本库。
一般约定俗称裸版本库的目录名以.git为后缀
用法3区别于用法2之处在于用法3克隆出来的裸版本库对上游版本库进行了注册,这样可以在裸版本库中使用git fecth命令和上游版本库进行持续同步
git push [<remote-repos> <refspec>]
git pull [<remote-repos> <refspec>]
<remote-repos>是远程版本库的地址或者名称,<refspec>是引用表达式
不使用 --bare 或 --mirror 创建出来的克隆包含工作区,这样会产生两个包含工作区的版本库,这两个版本库是对等的。
这两个工作区本质没有区别,但往往提交是在一个版本(A)中进行的,另外一个(B)作为备份,
对于这种对等工作区模式,版本库的同步只有一种可行的操作模式,
备份库(B)执行git pull命令从原版本库(A)中拉回新的提交实现版本同步。
- $ git clone F:/gitdemo F:/gitdemo-backup
- Cloning into 'F:/gitdemo-backup'...
- done.
在gitdemo版本库 生成一些测试提交(使用--allow-empty参数可以生成空提交)
- $ git commit --allow-empty -m "sync test1"
- [master 1182f2e] sync test1
- $ git commit --allow-empty -m "sync test2"
- [master 81703be] sync test2
尝试push
- $ git push F:/gitdemo-backup
- fatal: The current branch master has no upstream branch.
- To push the current branch and set the remote as upstream, use
-
- git push --set-upstream F:/gitdemo-backup master
为了实现同步,需要进入到备份库中,执行git pull命令
- $ git pull
- remote: Counting objects: 2, done.
- remote: Compressing objects: 100% (2/2), done.
- remote: Total 2 (delta 1), reused 0 (delta 0)
- Unpacking objects: 100% (2/2), done.
- From F:/gitdemo
- 8cc0e9d..81703be master -> origin/master
- Updating 8cc0e9d..81703be
- Fast-forward
- $ git log --oneline -2
- 81703be sync test2
- 1182f2e sync test1
为什么执行git pull命令时没有像执行git push 命令那样提供那么多的参数呢?
这是因为在执行 git clone操作后,克隆出来的gitdemo-backup版本库中对源版本库(上游版本库)进行了注册,
所以在gitdemo-backup版本库中执行拉回操作,无须设置上游版本库的地址
在gitdemo-backup版本库中可以使用如下命令查看上游版本库的注册信息:
- $ git remote -v
- origin F:/gitdemo (fetch)
- origin F:/gitdemo (push)
- $ cat .git/config
- [core]
- repositoryformatversion = 0
- filemode = false
- bare = false
- logallrefupdates = true
- symlinks = false
- ignorecase = true
- hideDotFiles = dotGitOnly
- [remote "origin"]
- url = F:/gitdemo
- fetch = +refs/heads/*:refs/remotes/origin/*
- [branch "master"]
- remote = origin
- merge = refs/heads/master
在对等工作区模式下,工作区之间执行推送,可能会引发大段的错误输出,如果采用裸版本库则没有相应的问题,这是因为裸版本库没有工作区。
没有工作区还有一个好处就是空间占用会更小。
- $ git clone --bare f:/gitdemo f:/gitdemo.git
- Cloning into bare repository 'f:/gitdemo.git'...
- done.
查看f:/gitdemo.git目录的内容
- $ ls -F f:/gitdemo.git
- config description HEAD hooks/ info/ objects/ packed-refs refs/
- $ git --git-dir=f:/gitdemo.git config core.bare
- true
- $ git commit --allow-empty -m "sync test 3"
- [master 66c420d] sync test 3
- $ git commit --allow-empty -m "sync test 4"
- [master ccb2e4a] sync test 4
- $ git push f:/gitdemo.git master:master
- Counting objects: 2, done.
- Delta compression using up to 4 threads.
- Compressing objects: 100% (2/2), done.
- Writing objects: 100% (2/2), 273 bytes | 0 bytes/s, done.
- Total 2 (delta 1), reused 0 (delta 0)
- To f:/gitdemo.git
- 81703be..ccb2e4a master -> master
裸版本库不但可以通过克隆的方式创建,还可以通过git init命令以初始化的方式创建
- $ git init --bare f:/gitdemo-init.git
- Initialized empty Git repository in f:/gitdemo-init.git/
- $ ls -F f:/gitdemo-init.git
- config description HEAD hooks/ info/ objects/ refs/
- $ git --git-dir=f:/gitdemo-init.git config core.bare
- true
- $ git push f:/gitdemo.git
- fatal: The current branch master has no upstream branch.
- To push the current branch and set the remote as upstream, use
-
- git push --set-upstream f:/gitdemo.git master
因为gitdemo-init.git版本库刚刚初始化完成,还没有任何提交,更不要说分支了。
当执行git push命令时,如果没有设定推送的分支,而且当前分支也没有注册到远程的某个分支,将检查远程分支是否有和本地相同的分支名(如master),如果有 则推送,否则报错。
- $ git push f:/gitdemo.git master:master
- Counting objects: 2, done.
- Delta compression using up to 4 threads.
- Compressing objects: 100% (2/2), done.
- Writing objects: 100% (2/2), 273 bytes | 0 bytes/s, done.
- Total 2 (delta 1), reused 0 (delta 0)
- To f:/gitdemo.git
- 81703be..ccb2e4a master -> master
可以简写:
- $ git push f:/gitdemo.git master
- Everything up-to-date
- $ git --git-dir=/f/gitdemo-init.git log --oneline -2
- ccb2e4a sync test 4
- 66c420d sync test 3
- $ git commit --allow-empty -m "sync test 5"
- [master 53a931c] sync test 5
- $ git commit --allow-empty -m "sync test 6"
- [master 020e5bd] sync test 6
- $ git push f:/gitdemo-init.git master
- Counting objects: 2, done.
- Delta compression using up to 4 threads.
- Compressing objects: 100% (2/2), done.
- Writing objects: 100% (2/2), 273 bytes | 0 bytes/s, done.
- Total 2 (delta 1), reused 0 (delta 0)
- To f:/gitdemo-init.git
- ccb2e4a..020e5bd master -> master
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。