本节学习如何使用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. python识别图片中的代码。

    在看并发编程网的时候,有些示例代码是以图片的形式出现的,要是此时自己想复制下来的话,只能对着图片敲了,很不爽,于是搜了一下识别图片的网站,有! 把图片上传上去解析,下来txt文本,打开一看,大部分能解 ...

  2. angular $resouse服务

    创建服务 var taskInstancesResource = function ($resource) { var resource = $resource('/ssc-cutover/rest/ ...

  3. 使用LinkedList类生成一个集合对象,循环加入“小样1”,“小样2”,“小样3”,“小样4”,“小样5”……“小样100”。输出这个集合的大小。再使用循环删除这个集合中所有名字为偶数的对象,比如“小样6”,“小样100”,都是偶数名。最后:循环输出集合中所有的对象,看是否删除成功。

    package com.lanxi.demo1_8; import java.util.Iterator; import java.util.LinkedList; public class Test ...

  4. 【C#】await & Result DeadLock

    随意使用异步的await和Result,被弄得欲仙欲死,然后看了 Don't Block on Async Code,稍许明白,翻译然后加上自己的理解以加深印象. 会死锁的两个例子 UI例子 publ ...

  5. Python机器学习(python简介篇)

    1.Python 数据类型 Python 内置的常用数据类型共有6中: 数字(Number).布尔值(Boolean).字符串(String).元组(Tuple).列表(List).字典(Dictio ...

  6. 通过SSH去连接 github 和bitbucket

    github 和 bitbucket 都是项目托管服务器, 1 创建SSH private key and public key 首先需要安装git命令, 并且请检查是否有ssh 命令. 打开 Git ...

  7. java版数据结构与算法第二章数组

    数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...

  8. dubbo could not get local host ip address will use 127.0.0.1 instead 异常处理

    dubbo could not get local host ip address will use 127.0.0.1 instead 查看hostname localhost:spring wls ...

  9. Log Filter分析

    1 log filter analysis分析 filter:与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中.但是与其他web应用程序组件不同的是,过滤器是&qu ...

  10. 两个action之间进行跳转

    名字 说明 Chain 用来处理Action链 Dispatcher 用来转向页面,通常处理JSP FreeMarker 处理FreeMarker模板 HttpHeader 用来控制特殊的Http行为 ...