git clone

1.不要把鸡蛋放在同一个篮子里

用法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>是引用表达式


2.对等工作区


不使用 --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


在gitdemo-backup版本库中查看提交日志,可以看到在gitdemo版本库中的新提交已经被拉回到gitdemo-backup版本库中

$ 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

3.克隆生成裸版本库


在对等工作区模式下,工作区之间执行推送,可能会引发大段的错误输出,如果采用裸版本库则没有相应的问题,这是因为裸版本库没有工作区。

没有工作区还有一个好处就是空间占用会更小。

$ git clone --bare f:/gitdemo f:/gitdemo.git
Cloning into bare repository 'f:/gitdemo.git'...
done.

克隆出来的f:/gitdemo.git目录就是版本库目录,不包含工作区

查看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

进入gitdemo版本库,生成一些测试提交

$ 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


4.创建生成裸版本库


裸版本库不但可以通过克隆的方式创建,还可以通过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


继续在gitdemo版本库中执行几次提交

$ 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

再次向gitdemo-init.git推送

$ 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

















  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值