本节学习如何使用git clone命令建立版本库克隆,以及如何使用git push和gitpull命令实现克隆之间的同步。

 Git的版本库目录和工作区在一起,因此存在一损俱损的问题,即如果删除一个项目的工作区,同时也会把这个项目的版本库删除掉。一个项目仅在一个工作区中维护太危险,如果有两个工作区就会好很多。

  

 图片中一个项目使用了两个版本库进行维护,两个版本库之间通过pull和push操作实现同步:

<1>版本库A通过克隆操作创建克隆版本库B

<2>版本库A可以通过push(推送)操作,将新提交传递给版本库B

<3>版本库A可以通过pull(拉回)操作,将版本库B中的新提交拉回到自身

<4>版本库B可以通过pull操作,将版本库A中的新提交拉回到自身

<5>版本库B可以通过push操作,将新提交传递给版本库A

 Git使用git clone命令实现版本库克隆,主要有三种用法:

<1>git clone <repository> <directory>

<2>git clone --bare <repository> <director.git>

<3>git clone --mirror <repository> <director.git>

这三种用法的区别:

<1>用法一将<repository>指向的版本库创建一个克隆到<directory>目录。目录<directory>相当于克隆版本库的工作区,文件都会检出,版本库位于工作区下的.git目录中。

<2>用法二和用法三创建的版本库都不包含工作区,直接就是版本库的内容,这样的版本库称为裸版本库。一般约定俗成裸版本库的目录以.git为后缀。

<3>用法三区别于用法二之处在于用法三克隆出来的裸版本对上游版本库进行了注册,这样可以在裸版本库中使用git fetch命令和上游版本库进行持续同步。

 对等工作区,不使用--bare或--mirror创建出来的克隆包含工作区,这样就会产生两个包含工作区的版本库,这两个版本库是对等的。

 这两个工作区本质上没有区别,但是往往提交是在一个版本中进行的,另外一个作为备份。对于这种对等工作区模式,版本库的同步只有一种可行的操作模式,就是备份库执行git pull命令从源版本库中拉回新的提交实现版本库同步。为什么不能从版本库A向版本库B执行git push推送操作呢?看下面的操作。

<1>执行克隆命令

[root@git demo]# git clone /git/my/workspace/demo /git/my/workspace/demo-backup
Initialized empty Git repository in /git/my/workspace/demo-backup/.git/

<2>进入demo版本库,生成一些测试提交(使用--allow-empty参数可以生成空提交)

[root@git demo]# git commit --allow-empty -m "sync test 1"
[master 4f18802] sync test 1
[root@git demo]# git commit --allow-empty -m "sync test 2"
[master e8d59b4] sync test 2

<3>能够在demo版本库向demo-backup版本库执行push操作吗?

[root@git demo]# git push /git/my/workspace/demo-backup/
Counting objects: 2, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 270 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /git/my/workspace/demo-backup/
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '/git/my/workspace/demo-backup/'

<4>为了实现同步,需要进入到备份库中执行git pull操作

[root@git demo]# cd /git/my/workspace/demo-backup/
[root@git demo-backup]# git pull
From /git/my/workspace/demo
06e5df8..e8d59b4 master -> origin/master
Updating 06e5df8..e8d59b4
Fast-forward
[root@git demo-backup]# git log --oneline -2
e8d59b4 sync test 2
4f18802 sync test 1

 下面介绍下裸版本库,裸版本库不但可以通过克隆的方式创建,还可以通过git init命令以初始化的方式创建,之后的同步和上面的同步方式大同小异。

 命令git init是用于初始化一个版本库的,之前执行git init命令初始化的版本库是带工作区的,如何以裸版本库的方式初始化一个版本库呢?答案是使用--bare参数。

<1>创建一个裸版本仓库。

[root@git repos]# git init --bare demo-init.git
Initialized empty Git repository in /path/to/repos/demo-init.git/

<2>查看一下demo-init.git下的内容

[root@git repos]# ls -F demo-init.git/
branches/ config description HEAD hooks/ info/ objects/ refs/

<3>查看一下这个版本库的配置core.bare的值

[root@git repos]# git --git-dir=/path/to/repos/demo-init.git config core.bare
true

<4>向裸版本库中推送数据,进入源版本库中执行操作

[root@git demo]# git push /path/to/repos/demo-init.git master:master
Counting objects: 21, done.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (21/21), 1.90 KiB, done.
Total 21 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (21/21), done.
To /path/to/repos/demo-init.git
* [new branch] master -> master

<5>查看一下demo-init.git版本库中的提交

[root@git demo]# git --git-dir=/path/to/repos/demo-init.git log --oneline -2
e8d59b4 sync test 2
4f18802 sync test 1

<6>继续在demo中执行几次提交,再向demo-init.git中推送

[root@git demo]# git commit --allow-empty -m "sync test 5"
[master 2007420] sync test 5
[root@git demo]# git commit --allow-empty -m "sync test 6"
[master 49f01b9] sync test 6

[root@git demo]# git push /path/to/repos/demo-init.git
Counting objects: 2, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 269 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
To /path/to/repos/demo-init.git
e8d59b4..49f01b9 master -> master

 为什么这次使用git push命令后面没有跟上分支名呢?这是因为远程版本库中已经不再是空版本库了,有名为master的分支,通过以下命令查看远程版本库分支

[root@git demo]# git ls-remote /path/to/repos/demo-init.git
49f01b9d4d7a4c558def93fcbe88f8e3137b5b6f HEAD
49f01b9d4d7a4c558def93fcbe88f8e3137b5b6f refs/heads/master

第六节《Git克隆》的更多相关文章

  1. git第六节---git 远程仓库

    远程分支类似于本地分支,是指向远程仓库中的文件的指针. 1.远程分支抓取 @git fetch origin dev :拉取远程dev内容 fetch不会对本地仓库内容进行更新,只更新远端commit ...

  2. Tigase-02 tigase-server7.1.0使用git 克隆下来,并在eclipse 上运行调试

    继 Tigase-01 使用spark或spi登录Tigase服务器,这节说明下使用 eclipse git克隆 tigase-server7.1.0,并运行调试!最近有不少同学尝试去git clon ...

  3. VS2013 GIT 克隆远程仓库

    1.配置本地GIT 工具->选项->源代码管理,选择GIT 2.打开团队资源管理器,找到GIT克隆选项 3.单击克隆,在输入框内输入远程仓库地址,然后单击克隆即可 GIT 插件配置:参考  ...

  4. android 入门-android Studio git 克隆

    最后是完成 以上是如何从android studio Git 克隆Github的项目

  5. 基于Extjs的web表单设计器 第六节——界面框架设计

    基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...

  6. git 克隆项目 与 分支简单操作

    git clone http://abcde.com/myproject/abc.git 克隆远程项目到本地githome文件夹git branch -a 查看所有分支 包括远程和本地 *号开头表示当 ...

  7. 1. Git 克隆代码

    1. Git 克隆代码 git clone git://github.com/facebook/hiphop-php.git 2. Git更新分支 查看服务器上的所有分支 [huzg@slave3 h ...

  8. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  9. VUE2.0实现购物车和地址选配功能学习第六节

    第六节 地址列表过滤和展开所有的地址 html:<li v-for="(item,index) in filterAddress">js: new Vue({ el:' ...

  10. delphi 线程教学第六节:TList与泛型

    第六节: TList 与泛型   TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...

随机推荐

  1. java知识点总结----java入门(1)

    1.首先的明白什么是java? 1.java是一门编程语言 2.java是开发环境 3.java是运行环境 2.java概况--java构架 1.J2SE (Java2 Standard Editio ...

  2. Linux:PCBSD系统的安装

    这期继续更新有关Linux系统的安装步骤以及使用,感兴趣的可以来看下!!! 安装PCBSD系统 系统映像文件下载 PCBSD 9.2官方正式版:http://www.veryhuo.com/down/ ...

  3. python实现文件的复制

      # 练习: # 1. 写程序,实现文件的复制,(注:只复制文件,不复制文件夹) # 要求: # 1) 要考虑文件关闭的问题 # 2) 要考虑超大文件无法一下加载到内存的问题 # 3) 要能复制二进 ...

  4. 认识Python 列表和元组

    列表用方括号   l=[['xyz',123], 'abc', 3140000000.0, (23+1.3j), 'ddd'] 元组用圆括号   t=(['xyz', 123],'abc', 3140 ...

  5. python学习笔记3-函数

    一.函数高级特性 1)列表生成式,列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. eg: >>> list(r ...

  6. wpf 事件

    事件的本质是 系统消息  再winform中 消息被封装成了事件触发 这种就是 普通事件,特点就是 1对1,以及事件必须能访问到控件 才能绑定 在 wpf中 新概念  路由事件  ,路由区别是 不在是 ...

  7. python初学之缓存清理:完全相同的代码与环境但是其中一个文件可以执行成功,一个执行不成功

    在使用python写接口测试脚本时,想要引入logging模块来在控制台输出当前执行进度日志,但是遇到了奇葩问题,困扰了一整个下午: 代码如下: __author__ = 'test'#!/usr/b ...

  8. iOS开发,改变系统铃声音量和静音,并非媒体播放音量

    使用AVSystemController可以改变系统声音,而且是铃声,并非媒体播放的声音. 它可以让iPhone手机静音.但是,AVSystemController存在于私有Celestial框架中. ...

  9. 牛客网PAT乙级(Basic Level)真题-数字分类 (20)

    题目描述 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4 ...

  10. Python中常见的序列及其函数

    分片:分片操作的实现需要提供两个索引作为边界,第一个包含在分片内,第二个不包含 number =[1,2,3,4,5,6,7,8,9,10] number [3:6]  -->[4,5,6] n ...