《Git学习指南》——2.3 Git的协作功能

2.3 Git的协作功能

现在,我们已经有了一个存放项目文件的工作区,以及一个存放项目历史的版本库。在一个像CVS和Subversion这样传统的集中式版本系统中,尽管每个开发者也都有属于他/她自己的工作区,但所有人都共享了一个通用的版本库。而在Git中,每个开发者拥有的是一个属于他/她自己的、自带独立版本库的工作区,因此这已经是一个不依赖于中央服务器的、完整的版本控制系统了。开发者们可以通过交换各自版本库中的提交来实现项目合作。下面我们就来做个试验,先创建一个新的工作区,以便我们模拟第二位开发者的活动。

2.3.1 克隆版本库
我们的这位新开发者首先要有一个属于他/她自己的版本库副本(也称为克隆体)。该副本中包含了所有的原始信息与整个项目的历史信息。下面。我们用clone命令来创建一个克隆体。

> git clone /projects/first-steps /projects/first-steps-clone
Cloning into first-steps-clone...
done.

现在,该项目结构如图2.4所示。

图2.4 样例项目与它的克隆体

2.3.2 从另一版本库中获取修改
下面,我们来修改一下first-steps/foo.txt文件,并执行以下操作来创建一次新提交。

> cd /projects/first-steps
> git add foo.txt
> git commit --message "A change in the original."

现在,新的提交已经被存入了我们原来的first-steps版本库中,但其克隆版本库(first-stepsclone)中依然缺失这次提交。为了让你更好地理解这一情况,我们来看一下first-steps的日志。

> git log --oneline
a662055 A change in the original.
7ac0f38 Some changes.
2f43cd0 Sample project imported.

在接下来的步骤中,我们再来修改克隆版本库中的first-steps-clone/bar.html文件,并执行以下操作。

> cd /projects/first-steps-clone
> git add bar.html
> git commit --message "A change in the clone."
> git log --oneline
1fcc06a A change in the clone.
7ac0f38 Some changes.
2f43cd0 Sample project imported.

现在,我们在两个版本库中各做了一次新的提交。接下来,我们要用pull命令将原版本库中的新提交传递给它的克隆体。由于之前我们在创建克隆版本库时,原版本库的路径就已经被存储在了它的克隆体中,因此pull命令知道该从哪里去取回新的提交。

> cd /projects/first-steps-clone 

> git pull 

remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /projects/first-steps
   7ac0f38..a662055 master -> origin/master
Merge made by recursive.
foo.txt |      2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

如上所示,pull命令从原版本库中取回了新的修改,将它们与克隆体中的本地修改进行了对比,并在工作区中合并了两边的修改,创建了一次新的提交。这个过程就是所谓的合并(merge)。

请注意!合并过程在某些情况下可能会带来冲突。一旦遇到了这种情况,Git中就不能进行自动化的版本合并了。在这种情况下,我们就必须要手动清理一些文件,然后再确认要提交哪些修改。

在拉回(pull)、合并(merge)的过程完成之后,我们可以用一个新的log命令来查看结果。这次是日志的图形化版本。

> git log --graph
9e7d7b9 Merge branch ’master’ of /projects/first-steps
*
|\
| * a662055 A change in the original.
* | 1fcc06a A change in the clone.
|/
* 7ac0f38 Some changes.
* 2f43cd0 Sample project imported.

这一次,历史记录不再是一条直线了。在上面的日志中,我们可以很清晰地看到并行开发的过程(即中间的两次提交),以及之后用于合并分支的那次合并提交(即顶部的那次提交)。

2.3.3 从任意版本库中取回修改
在没有参数的情况下,pull命令只在克隆版本库中能发挥作用,因为只有该克隆体中有默认的原版本库的连接。当我们执行pull操作时,也可以用参数来指定任意版本库的路径,以便从某一特定开发分支中提取相关修改。

现在,让我们将克隆体中的修改pull到原版本库中吧。

> cd /projects/first-steps
> git pull /projects/first-steps-clone master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From /projects/first-steps-clone
 * branch           master →  FETCH_HEAD
Updating a662055..9e7d7b9
Fast-forward
bar.html |    2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

2.3.4 创建共享版本库
除了可以用pull命令从其他版本库中取回相关提交外,我们也可以用push命令将提交传送给其他版本库。只不过,push命令只适用于那些没有开发者在上面开展具体工作的版本库。最好的方法就是创建一个不带工作区的版本库,我们称之为裸版本库(bare repository)。你可以使用clone命令的--bare选项来创建一个裸版本库。裸版本库通常可被用来充当开发者们传递提交(使用push命令)的汇聚点,以便其他人可以从中拉回他们所做的修改。下面我们来看一个裸版本库(见图2.5)。

图2.5 裸版本库(一个没有工作区的版本库)

> git clone --bare /projects/first-steps
                       /projects/first-steps-bare.git
Cloning into bare repository first-steps-bare.git...
done.

2.3.5 用push命令上载修改
为了演示push命令的使用,我们需要再次修改一下firststeps/foo.txt文件,并执行以下操作来创建一次新的提交。

> cd /projects/first-steps
> git add foo.txt
> git commit --message "More changes in the original."

接下来,我们就可以用push命令向共享版本库传送该提交了(见图2.6)。该指令的参数要求与pull命令相同,我们需要指定目标版本库的路径及其分支。

> git push /projects/first-steps-bare.git master
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 293 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /projects/first-steps-bare.git/
    9e7d7b9..7e7e589 master -> master

图2.6 经由共享版本库来进行版本共享

2.3.6 Pull命令:取回修改
现在,为了让克隆版本库也得到相应的修改,我们需要在执行pull命令时配置参数指向共享版本库的路径参数。

> cd /projects/first-steps-clone 

> git pull /projects/first-steps-bare.git master 

remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../first-steps-bare
 * branch      master      -> FETCH_HEAD
Updating 9e7d7b9..7e7e589
Fast-forward
 foo.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

请注意!如果另一个开发者在我们之前已经做过一次push操作,此次push命令就会被拒绝传送提交。这时候,我们必须要先做一次pull操作,将其他人新上载的更新取回,并在本地合并。

时间: 2024-11-09 00:43:06

《Git学习指南》——2.3 Git的协作功能的相关文章

《Git学习指南》——导读

** 前言 **Git的背后有着一个非常精彩的成功故事.2005年4月,Linus Torvalds因不满当时任何一个可用的开源版本控制系统,就亲自着手实现了Git.时至今日,如果我们在Google中搜索"git version control"这几个关键词,都会看到数以百万计的返回结果.Git已经俨然成为了新型开源项目的一个标准.许多大型的开源项目都已经或正在计划迁移到Git上来. 下面,我们来看一下这么多人之所以会选择Git的原因. Git允许我们利用分支来开展工作:在一个由多个开

《Git学习指南》——第2章 入门 2.1准备Git环境

第2章 入门 第1章 Spring如果你想试着用一下Git的话,那么我们马上就可以开始了.本章将会带领你创建自己的第一个项目.我们会为你演示那些用于提交修改版本.查看历史和与其他开发者交换版本的命令. 2.1 准备Git环境 首先,我们需要安装好Git.你可以在Git的官网上找到你所需要的一切: http://git-scm.com/downloadGit是一个高可配置软件.首先,我们可以宣布用config命令配置一下用户名和用户邮箱:[1] > git config --global user

《Git学习指南》——2.2 第一个Git项目

2.2 第一个Git项目 在这里,我们建议你最好能为接下来的Git测试单独开辟一个项目.总之应先从一个简单的小项目开始.在我们这个小小的示例项目中,first-steps目录下只有两个文本文件,如图2.1所示. 图2.1 我们的示例项目 在开始摆弄这个玩具项目之前,我们建议你最好先做一个备份!尽管在Git中,想要造成永久性的删除或破坏也不是件容易的事情,而且每当你要做某些"危险"动作的时候,Git通常也会发出相应的警告消息.但是,有备无患总是好的. 2.2.1 创建版本库现在,我们首先

git学习------>写给 Git 初学者的7个建议

PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-development/git-tips/) 当我刚刚开始使用Git的版本控制时,我根本不确定我付出那么多时间是不是会得到回报.Branch.Stage.Stash,这些Git名词对我来说都非常陌生. 而今天的我已不能想象生活没有Git会变成什么样.Git不仅提供了我非常需要的版本控制功能,还让我变成一个更优秀

git学习------>如何修改git已提交的记录中的Author和Email?

一.背景 最近搭建好GitLab后,准备陆陆续续的将之前在SVN仓库中保存的代码迁移到GitLab上,昨天顺利将三个Android组件的代码迁移到GitLab后,其他同事发现迁移是成功了,但是pull下来命令后查看git log 发现所有人的有些都配置成了我的邮箱,尴尬啊. GitLab上面全部变成了我的提交记录,尴尬. 二.原因分析 下面具体分析下为什么产生这个的原因. 具体原因是因为再做SVN–>Git迁移准备的时候,第一步要建议SVN用户到Git用户的映射文件.而这个映射文件最终我将所有用

《Git学习指南》——第1章 基本概念 1.1分布式版本控制,有何过人之处

第1章 基本概念 在本章中,我们将介绍一个分布式版本控制系统的设计思路,以及它与集中式版本控制系统的不同之处.除此之外,我们还将带你了解分布式版本库的具体工作方式,以及为什么我们会说,在Git中创建分支和合并分支不是个大不了的问题. 1.1 分布式版本控制,有何过人之处 在具体探讨分布式版本控制的概念之前,让我们先来快速回顾一下传统的集中式版本控制架构. 图1.1中所显示的就是一个集中式版本控制系统(例如CVS或Subversion)的典型布局.每个开发者都在他或她自己的计算机上有一个包含所有项

《Git学习指南》——1.2 版本库,分布式工作的基础所在

1.2 版本库,分布式工作的基础所在 其实,版本库本质上就是一个高效的数据存储结构而已,由以下部分组成. 文件(即blob):这里既包含了文本也包含了二进制数据,这些数据将不以文件名的形式被保存.目录(即Tree):目录中保存的是与文件名相关联的内容,其中也会包含其他目录.版本(即commit):每一个版本所定义的都是相应目录的某个可恢复的状态.每当我们创建一个新的版本时,其作者.时间.注释以及其之前的版本都将会被保存下来.对于所有的数据,它们都会被计算成一个十六进制散列值(例如像1632acb

《Git学习指南》——2.4 本章小结

2.4 本章小结 工作区与版本库:工作区是一个包含.git子目录(内含版本库)中的目录.我们可以用init命令在当前目录中创建版本库.版本提交:一次版本提交通常定义了版本库中所有文件的一个版本,它详细说明了该版本是由何人在何时何地创建的.当然,我们需要用add命令来确定哪些文件将被纳入下一次提交,然后再用commit命令创建新的版本提交.查看信息:通过status命令,我们可以查看哪些文件已被本地修改,以及哪些修改将被纳入下次提交.另外,log命令可用来显示提交历史.diff命令可用来显示两个版

《Git学习指南》——1.3 分支的创建与合并很简单

1.3 分支的创建与合并很简单 对于大多数版本控制系统来说,分支的创建与合并通常会因其特殊性而被认为是高级拓展操作.但由于Git最初就是为了方便那些散落在世界各地的Linux内核开发者而创建的,合并多方努力的结果一直都是其面临的最大挑战之一,所以Git的设计目标之一就是要让分支的创建与合并操作变得尽可能地简单且安全. 在下面的图1.4中,我们向你展示了开发者是如何通过创建分支的方式来进行并行开发的.图中的每一个点都代表了该项目的一个版本(即commit).而由于在Git中,我们只能对整个项目进行