上篇文章我们主要简单的介绍了有关git的一些基本常识和一些简单的命令。但那终究是皮毛,我们使用git最主要的目的还是管理我们的项目,多人协作。本篇文章主要涉及以下两个大模块:

  • 分支的概念及原理
  • 远程仓库的使用

一、分支

     在介绍分支之前,我们首先先考虑为什么需要引入分支这个概念,究竟有哪些无法解决的问题,需要我们引入新的概念。

在没有分支这个概念之前,我们对于一个项目的开发只有一个进度,但是一旦发现项目的之前版本的某个节点出现bug,难道放弃到目前为止的所有开发,回退到bug节点进行修复吗?这是第一个亟待解决的问题。

对于我们软件业来说,一个软件肯定有不止一个版本,那么你不能要求所有用户全部升级到最新版本。那么对于同一个项目,难道我们放弃那些仍使用旧版本的用户,直接在原项目中开发新功能吗?这也是一个未解决的问题。

下面我们从解决上述问题出发,引出分支的概念。

我们沿着一条路进行开发,head指向当前最新一次commit,整条线路我们管它叫做分支(branch),但是我们发现之前的某次提交中出现bug,我们当然可以使用reset指令回退版本,但会丢失掉很大一部分代码。

针对这种情况,我们可以创建一个分支用于修复bug,而主分支继续开发,等bug修复完成之后,两分支合并即可。

对于上述的第二种问题,版本维护的问题。

这样在不同分支上的开发,两个分支完全不相互影响。一条分支维护这旧版本,另一条分支开发着新功能,等到旧版本不再需要维护时,删除该分支即可。那下面我们开始介绍分支的的相关命令。

     1、git branch

     和branch相关的命令主要有四个。

git branch:显示当前版本库中所有分支
git branch <branchname>:创建一个分支

我们都知道,版本库中有一个head指针,它指向的是当前分支的最新提交,而我们的上述命令只负责创建一个分支,但是不会将head指针移动到该分支上,也就是说head指针还是指向原分支。

git branch -d <branchname>;尝试删除某个分支
git branch -D <branchname>:强制删除某个分支

在执行分支删除命令的时候,如果该分支没有合并到其他分支中,git会拒绝删除,这是为了防误删。但是如果你实在不满意对新分支的开发也可以强制删除。

下面两个命令主要用于修改分支的名称。

git branch -m <oldbranchname> <newbranchname>:尝试修改
git branch -M <oldbranchname> <newbranchname>:强制修改

如果重命名的分支名已经存在的话将会被拒绝。那么强制修改分支名称将会覆盖被同名的分支,所以所有强制操作一定要慎重。

     2、git merge

     要分支就必然需要合并,否则新分支上的所有开发都无法影响到主分支,这是没有意义的。所以我们往往在新分支开发结束之后往主分支上合并。下面我们首先看一种快进式(Fast Forwarld)的合并方式。

快进式的合并就是直接将head指针快进到较远的一个分支的最新提交,也就是说,快进式合并的两个分支是一种从属关系,像这样的:

当前head指针是指向master分支的,而当我们对newBranch分支进行合并的时候,git将会直接把head指针移动到newBranch的最新提交上,但是head指针依然是指向master的。

我们在进行分支合并的时候,最常遇到的问题就是合并冲突,但是我们快进式合并是不会出现冲突的,因为两个分支是一种从属关系,进度慢的是进度快的一部分。下面我们看看合并时遇到冲突该如何解决。

分支合并的冲突指的是,两个不同的分支在各自开发过程中对相同文件进行了修改,那么git在合并分支的时候将不知道选择哪个分支上的修改作为该文件的修改,这样就产生冲突了。例如,我们在工作区创建两个分支,在两个分支上分别对文件test进行修改,然后再合并两分支。

我们打开导致两个分支合并冲突的文件,

git为我们向其中添加了一些符号,其中"<<<<<<< HEAD"表示的是当前的master分支,">>>>>>> newbranch"表示的是我们创建的新分支,而位于他们之间的"======="用于分隔两个分支的内容。从中我们很容易的看出来,master分支中此次的提交增加了以下信息,newbranch分支上也做了一次提交并增加了以上信息,所以两个分支冲突的地方就是在这里。

为了解决这种冲突情况,我们可以选择删除导致冲突的任意一方的修改,例如我们删除分支newbranch上的提交。

然后我们可以add,提交到当前分支即可完成冲突的解决。也就是说当我们执行merge指令来合并两个分支的时候,git会尽量去合并,但是如果遇到冲突,git也会呈现出两个文件之间的差异,要求我们手动的去解决它。还有一些关于远程分支的内容,我们将在下一节远程仓库中介绍。

2、远程仓库

     Git作为分布式的版本控制系统,你是你本地仓库的主人,但是想要实现多人的协作开发,你就要将你本地的开发推送到远程共享仓库中供大家下载,本篇主要以github作为远程服务器来介绍有关远程仓库这块内容。

作为我们的服务器,并不能让任何人向我们的git服务器上推送代码,只能让有凭证的人向服务器推送。git本地和github服务器之间是通过ssh对称秘钥来完成两者的身份确认的,至于ssh是什么,不了解的同学可以自行学习下,简单来说,它就是一个通讯加密协议。下面我们先生成一对ssh秘钥,执行以下代码:

$ ssh-keygen -t rsa -C "youremail@example.com"

然后一路回车即可,等生成成功之后,我们打开这个.ssh文件夹(这个文件夹的保存路径git已经给出,每个人都不一样),这里就是一对秘钥,一个是公钥,一个是私钥。公钥可以泄露出去,私钥一定保存好。接着,我们将公钥添加到github上,

这样我们本地的提交,github服务器就可以用列表中的公钥来识别提交者的身份,对于不认识的提交者服务器将予以拒绝。接下来我们看如何将本地的仓库关联服务器上的某个仓库。首先,我们在服务器上创建一个git仓库,

然后我们执行以下这条命令来为本地git库关联远程仓库,

$ git remote add origin git@github.com:Programer-yang/TestGit.git

上述这条命令不是绝对的,读者要根据自己的github账户和创建的远程仓库做适当的改动。执行成功之后,git是没有任何提示的,只有出现错误才会有所提示。这里的远程仓库名字,我们默认为origin,当然也是可以修改的,这个远程仓库的简称是为了简单替代长串的URL,在以后的推送和拉取中就可以使用这个简称来简化命令了。下面我们将介绍两个命令,一个用于将本地分支推送合并到远程仓库中,一个用于从远程仓库拉取最新分支。

     1、git push

     该命令用于将本地分支提交到远程分支上,它的完整命令格式为:

$ git push <远程主机名> <本地分支名>:<远程分支名>

例如我们向在本地分支新建一个test文件,然后向github推送。

然后我们打开github账户,可以明显看到我们创建的仓库收到一次提交,时间显示几分钟之前,而我们本地新建的文件也随着提交被创建在服务器上。

     2、git pull

     该命令主要用于拉取位于服务器上的最新分支到本地并合并,它等效于 git fetch + git merge。命令git fetch 会拉取服务器上的分支并保存在版本库的某个文件夹下,命令git merge则会将拉取下来的版本库与本地版本库进行合并。而我们的git pull命令就是两个命令的结合。它的格式如下:

git pull  <远程主机名> <远程分支名>:<本地分支名>

基本格式和上述介绍的push 命令类似,下面我们在服务器上新建一个文件index,模拟他人对仓库的提交,这样服务器上的分支就比本地的分支上游一次提交,我们在本地拉取服务器上最新分支。

打开我们工作目录,即可看到拉取下来的index文件,此时我们的本地版本库就和服务器上的仓库一模一样。

至此,我们简单的介绍了git中较为强大的两部分内容,分支的远程仓库。很多命令都有其简写的方式,以及使用参数和选项来简化操作,这里我们并没有介绍,在后续更加深入的文章中,这里的某些命令可能还会出现。总体上来说,本篇介绍的内容还算简单,总结不到之处,望指出,下一篇我们将介绍强大的检出和重置命令。

Git版本控制之多人协作的更多相关文章

  1. Git详细教程---多人协作开发

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

  2. git 分支管理——多人协作

    git 分支管理--多人协作 一般一个项目有一个master主分支,还有一个develop开发分支.主要是在develop分支上协作开发,然后merge合并到master主分支上. 当从远程仓库克隆时 ...

  3. git学习:多人协作,标签管理

    多人协作: 查看远程库的信息, git remote 推送分支到远程库 git push origin master/dev 注意:master是主分支,时刻需要与远程同步 dev是开发分支,也需要与 ...

  4. Git教程之多人协作

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin.要查看远程库的信息,用git remote:

  5. GIT简单使用——多人协作篇

    多人协作的工作模式通常是这样:1.首先,可以试图用git push origin <branch-name>推送自己的修改:2.如果推送失败,则因为远程分支比你的本地更新,需要先用git ...

  6. Git 分支管理 多人协作 远程仓库 补充

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了, 并且,远程仓库的默认名称是origin. 如果是本地仓库关联远程仓库 --- 要查看远程库的信息,用 ...

  7. git 学习笔记 --多人协作

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...

  8. Git详细教程(2)---多人协作开发

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

  9. Git 多人协作开发的过程

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

随机推荐

  1. Thrift总结(二)创建RPC服务

    前面介绍了thrift 基础的东西,怎么写thrift 语法规范编写脚本,如何生成相关的语言的接口.不清楚的可以看这个<Thrift总结(一)介绍>.做好之前的准备工作以后,下面就开始如何 ...

  2. Hibernate基础知识总结

    Hibernate是JDBC的轻量级的对象封装(encapsulation),它是一个独立的对象持久persistence层框架. hibernate要做的事,就是让对象投影到关系数据库中,然后实施化 ...

  3. Unity 游戏框架搭建 (一) 概述

      为了重构手头的一款项目,翻出来当时未接触Unity时候收藏的视频<Unity项目架构设计与开发管理>,对于我这种初学者来说全是干货.简单的总结了一下,以后慢慢提炼. 关于Unity的架 ...

  4. Chrome控制台使用详解

    Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...

  5. Mac之OS系统下搭建JavaEE环境 <五> 之Mysql数据库的安装及配置

    这里将推荐两款 集成的Mysql环境 十分轻便好用,MAMP 和 XAMPP MAMP XAMPP 1.MAMP下载 官网: https://www.mamp.info/en/ 下载安装即可使用 MA ...

  6. HttpClient以json形式的参数调用http接口并对返回的json数据进行处理(可以带文件)

    1.参数的url就是被调用的地址,map是你要传的参数.参数转成json我使用的是gson方式转换的. 主要使用的jar包有httpclient-4.5.3.jar.httpcore-4.4.6.ja ...

  7. Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)

    原始文章链接:http://www.lovebxm.com/2017/07/14/express-primer/ 1. Express 简介 Express 是基于 Node.js 平台,快速.开放. ...

  8. Lucene的使用与重构

    忽然一想好久不写博客了,工作原因个人原因,这些天一直希望一天假如36个小时该多好,但是,假如不可能. 由于近期在项目中接触了lucene,这个已经没有人维护的全文搜索框架,确实踩了不少坑,为什么用lu ...

  9. js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug

    URL  说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ...

  10. Codeforces Round #423 B. Black Square

    题目网址:http://codeforces.com/contest/828/problem/B 题目: Polycarp has a checkered sheet of paper of size ...