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. [Angular 2] implements OnInit, OnDestory for fetching data from server

    Link: https://angular.io/docs/js/latest/api/core/OnInit-interface.html, https://www.youtube.com/watc ...

  2. ArrayList 学习笔记

        接口   ArrayList实现了List接口,因此可以当作一个List来使用. 此外,ArrayList还实现RandomAccess接口和Serializable,说明ArrayList支 ...

  3. LSI SAS 2308配置操作

    介绍LSISAS2308的配置操作 3.1 登录CU界面 介绍登录LSISAS2308的CU配置界面的方法. 3.2 创建RAID 介绍在LSISAS2308扣卡上创建RAID的操作方法. 3.3 配 ...

  4. i2c sub system __i2c_board_list/klist_devices/klist_drivers

    i2c_devinfo全局链表: __i2c_board_list 用来挂接 i2c_board_info,这个信息用来生成 i2c_client i2c_client 链表: i2c_bus_typ ...

  5. jquery向下取整

    var currentMoney =Math.round((_memberCurrentPoints/_pointVsMoney)*Math.pow(10,2))/Math.pow(10,2) * 2 ...

  6. Error:Could not determine Java version-- 关于Android Studio JDK设置和JVM version设置

    最近在装AS的时候遇到一个问题,新建工程后,编译报错,Error:Could not determine Java version 不言而喻:可定是JDK的问题,网上查到2中可能性 第一:就是JDK路 ...

  7. Codeforces Round #318(Div 1) 573A, 573B,573C

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 这场的前两题完全是手速题...A题写了7分钟,交的时候已经500+了,好在B题出的 ...

  8. text-align:justify小例子

    一个使用 text-align: justify; 使元素均匀分布的小例子: <!DOCTYPE html> <html lang="en"> <he ...

  9. js版iphone通讯录分组列表效果

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  10. haslayout引起的IE6 :hover失效

    大家都知道IE6之支持<a>标签的:hover为了,但是通常在做实际效果的时候<a>标签 :hover在IE6下会失效, 看代码: [code="html" ...