git是一个版本控制工具,就要先弄清楚什么是版本

版本:

  • 对外发布的版本如v1.0.0,v1.1.0 叫version
  • 内部代码的版本叫commit,如:修改了一个错别字
  • 顾名思义一个version就是很多个commit的集合

那一个commit又包含哪些内容,比如有一个文件里边的内容是:

京口瓜洲一水间
钟山只隔数重山
春风又到江南岸
明月何时照我还

后来改成了

京口瓜洲一水间
钟山只隔数重山
春风又过江南岸
明月何时照我还

那这次改动就是一次commit

  • 新的文件就是新版本
  • 旧的文件就是旧版本
  • 从旧到新的差异叫变更(diff)

可以理解为一个commit里边存的就是一个差异,比如上例就可以表示为:

-春风又到江南岸
+春风又过江南岸

这样我们就可以清楚的知道某个版本做了什么样的修改,同时还能知道这个时候文件的全部内容是什么样的

为了能准确定位到某个版本,git给每个commit一个独一无二的ID,比如a823b1这样的16进制数(可以只用前几位,只要唯一就行)

commit-ID的生成算法:使用当前版本的所有文件内容父commit-ID算一个hash值

分支

如果刚好有另外一个人也对源文件做了修改:

-春风又到江南岸
+春风又绿江南岸

那这时候就会有俩条版本线(分支)

 ┌──────过(a8)
到(c3)
└──────绿(b2)

括号里是commit-ID

git实现版本线的方法很巧妙:

  • 为每个commit再添加一个属性:父commit-ID
  • 为每个分支添加一个属性 当前commit-ID(HEAD)
        HEAD=a8
|
┌──────过(a8)
到(c3)
└──────绿(b2)
|
HEAD=b2

比如:

  • 你的分支存的当前commit-ID为a8
  • 找到ID为a8的commit,查到他的父commit-ID为c3
  • 重复上一步

这样就可以形成一条分支线

分支原理很重要几乎所有神乎其技的git操作都是通过它实现的

这个时候俩条版本线是孤立的,如果只是这样简单的各干各的,那咱们的教程也就《全剧终》了

可惜原作者采纳了绿的建议,但也要对做记录,这时候就该版本管理工具提供的更加强大的功能协作出马,我们一起为同一个项目添砖添瓦,然后统一意见(分支合并)

合并后的整个版本变更过程就变成:

到 过 绿
git合并分支有俩种办法:merge,rebase。在git使用中不用merge是可以的,但rebase是必须技能,所以本教程只讲解rebase,merge请参见其他教程。

整个合并的步骤:

  • b2所在的分支上操作(因为他是最终的修改)
  • b2的变更加到a8后边
  • b2的 父commit-ID 设置为 a8
  • 重新为b2算一个新的commit-ID 1e
  • 修改本分支的HEAD为1e

如下所示:

            HEAD=a8
|
到(c3)──────过(a8)──────绿(1e)
|
HEAD=1e

三个库

分支

在git中我们一般会使用master分支作为主分支(成熟的分支),平常我们会在master分支上支出来一个新的不成熟分支进行开发,以便在遇到bug或者新需求时再基于master拉一个纯净的分支,这些分支都是存储于本地库中,除了本地库还有远程库、远程镜像库

远程库

就是我们的git服务器,他其实和我们的本地库是一模一样的存在,它和每个人的工作目录没有任何区别,只是我们把这台机器作为中心节点汇总我们的改动。默认名字是origin。

远程镜像库

git是一个离线版本控制系统,它设计了很多功能以支持离线工作。远程镜像库顾名思义就是远程库的一个本地镜像,我们不可以修改它,只能让他更新。这样所有读取远程库就变成本地操作。

git fetch 更新远程镜像库

git brannch 显示所有分支,以remote打头的都是远程镜像库里的分支(像上边说的我们无法直接查看远程库中分支)

如何更新本地库

git不能更新库。操作的对象只是分支和commit,我们只是用本地分支合并远程分支,也就是让本地分支包含远程分支的所有commit,也就达到了更新本地分支的效果(是不是和合并本地分支是一样的道理)

具体操作:git rebase origin/master

提交代码到服务器

将我们的master分支更新到和远程master一样后就可以推送commit到远程库

git push orgin master 将本地master分支推送到远程库(以及远程镜像库)master分支

其他的远程分支

其他的远程分支其实和master分支是一样的,只是我们使用master作为最成熟的代码分支。如果怕电脑硬盘坏导致未推送到远程master的代码丢失,我们就可以push到远程其他分支保存我们的分支。或者是几个人公共开发同一个功能也需要一个远程分支来汇总大家的工作进展

本文都是一些概念用于大家对git有一个总体的理解,具体操作还需查看pro git、git help或其他教程。

5分钟精通git教程的更多相关文章

  1. 30分钟新手git教程

    本文转载自:http://igeekbar.com/igeekbar/post/82.htm Git近些年的火爆程度非同一般,这个版本控制系统被广泛地用在大型开源项目(比如Linux),不同规模的团队 ...

  2. 从零开始学数据分析,什么程度可以找到工作?( 内附20G、5000分钟数据分析工具教程大合集 )

    从零开始学数据分析,什么程度可以找到工作?( 内附20G.5000分钟数据分析工具教程大合集 )   我现在在Coursera上面学data science 中的R programming,过去很少接 ...

  3. Git 教程(一):简介和安装

    为什么要编写这个教程?因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的 ...

  4. Git-Runoob:Git 教程

    ylbtech-Git-Runoob:Git 教程 1.返回顶部 1. Git 教程 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torva ...

  5. 21分钟 MySQL 入门教程(转载!!!)

    21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...

  6. Git教程推荐

    推荐:廖雪峰的官方网站-Git教程,面向初学者,浅显易懂.

  7. js基础到精通全面教程--JS教程

    适合阅读范围:对JavaScript一无所知-离精通只差一步之遥的人 基础知识:HTML JavaScript就这么回事1:基础知识 1 创建脚本块 1: <script language=”J ...

  8. Git 教程

    Git 教程 新建 模板 小书匠 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过设置里的修改模板来改变新建文章的内容. Git使用 Git - 关于版本控制 TortoiseGit日常 ...

  9. 办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时)

    办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时) 乔布斯的成功离不开美轮美奂的幻灯片效果,一个成功的商务人士.部门经理也少不了各种各样的PPT幻灯片.绿色资源网给你提供了 ...

随机推荐

  1. Yum出错Error: Cannot find a valid baseurl for repo: base

    centos yum 错误 Error: Cannot find a valid baseurl for repo: addons 装了个CentOS 6.5,使用yum时出现了以下的错误提示. [r ...

  2. C语言——文件

    需要理解的知识点:数据流.缓冲区.文件类型.文件存取方式   C语言可以将相关定义的数据按照内存的原样写入文件,这对于大规模数据来说比较方便,因为文件的尺寸比单纯的ASCII存储要小很多. 一.文件 ...

  3. PLSQL developer 连接不上64位Oracle 的解决方法

    Windows 64位下装Oracle 11g 64位,PLSQL Developer使用出现以下问题: 1.Database下拉框为空:2.强制输入用户名.密码及Database,登录弹出: 引用 ...

  4. android Settings 解析

    1.Settings的主界面的实现: Settings采用了PreferenceActivity和PreferenceFragment结合的实现方式. Settings.java继承自Preferen ...

  5. UITextField点击return后注销第一响应者

    // 当点击了return按钮,就让text调用自己的endEditing方法 [textField addTarget:textField action:@selector(endEditing:) ...

  6. mybatis的缓存机制

    一级缓存: MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效) packa ...

  7. JAVA--聊天界面面板

    package windows.beautify; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event ...

  8. 前端笔试题目小结--获取输入参数用户名;查询URL字符串参数

    编写一个JavaScript函数getSuffix,用于获得输入参数的后缀名.如输入abc.txt,返回txt. str1 = "abc.txt"; function getSuf ...

  9. Tarjan求极大强连通分量模板

    #include<iostream> #include<cstring> #include<cstdio> #include<stack> #inclu ...

  10. 一种用css实现图片在父框中等比缩放并垂直居中的办法

    一个网页中往往会有很多图片,而网站的编辑上传图片时可能并不一定按照为父框设定的那个宽高来传,这样图片往往会将父框撑开或者被父框截断.一种比较好的解决的办法是这样的: HTML代码结构: <div ...