概述

当我初次接触git时,我需要快速学习基本的git工作流,以便快速接收一个开源Web项目维护。但是,我很难理解工作流程,因为我不太了解git使用关键点。

forkclonepullbranch、保存、测试、add,评论、commitpush(注: 以上黑体的单词都是git命令的部分),再次测试,讨论以及重复进行这六个步骤,仅仅为更新进网站,就有这样繁琐的不走,是有点很夸张,有点大张旗鼓。所有初学者都可能会迷惑,会烦恼,会骂搞这么复杂搞毛线。

网上git教程非常多,图文并茂的也不少,在此不愿意重复论述。我们在此只对典型的git工作流程做一下描述、对流程各个关键过程和步骤作出解释。以此作为一个基础,帮助初学者理解git的意义,帮他们快速上手。

为什么要使用Git?

Git是一个分布式版本控制系统(VCS),人们用它来控制文件的变更过程,对每一步的变化做跟踪,必要时候可以撤回,基于此让大家一起协作工作,其他的VCS还包括最初的RCS、CVS,微软的VSS,SVN,BitKeeper等。Git最初是Linus开发来用来为linux内核项目管理用的。

Git基于一个宗旨,鼓励大家都参与,基本上任何人都可以提出变更申请(github:Pull request,gitlab:Merge request),但只有少数负责人(Owner和开发组)可以接受,从而合并变更。一个人可以同时处理很多项目,为了管理这大量的项目(Repo),Git(工具)和Gitlab 、GitHub(协作网站)可以制作并保存许多版本的项目和其版本过程,每个项目对应不同的权限或用于不同的目的。

例如,例如构建公共项目代码通常在线托管GitHub中。如果想要修改,增加功能,解决bug,甚至是完善一下文档。我们都可以通过github网站上通过fork,在个人项目下创建一个副本,然后对这个副本进行修改,甚至是"蹂躏",但是无论你做什么原始版本都不会有任何的影响,直到你想把你的修改通过Pull request 提交给主项目,并且主项目的管理者接受你的请求。

先决条件:

创建一个GitHub帐户。

GitHub是一个共有项目托管网站,项目所有者保留项目的正式版本,其他人需要修改,先得有github账号,并fork得到项目的在线副本。当然对公开项目而言如果你只想在本地得到一个项目副本的话,只需要通过git clone 项目地址,即可。比如下面是虫虫的github个人页面:

在本地安装Git

Git是版本控制工具,帮助我们跟踪项目文件变更。他运行在我们本地电脑上。如果你本地系统是Linux的话,一般会默认安装,如果没有的话,你可以通过发行版的包管理系统安装,比如yum install git。windows版本git工具是由微软开发和维护的git for window(msysgit)和各种git GUI客户端。

当然git的根本还在于git命令行,通过git shell执行各个命令也是最方便最直白的,建议不管你有没有基础,都先从git shell开始,不要对命令产生任何的恐惧,他是你最好的朋友,当你使用任何图形git客户端工具出现问题时候也建议用git shell再试试,往往根据其错误提示最容易找到问题所在。

典型的github工作流程

一旦你安装了git并且创建了GitHub帐户(当然对内部项目你可以使用gitlab自建git托管网站),那么你的git之旅正式开始。首先找到你感兴趣的项目,fork或者clone复制它。这两个命令的区别是:fork是在github复制一个自己的在线的项目,你拥有完全地权限,可以任意"蹂躏"。clone是在本地复制一份项目,除非你clone的是自己的项目,否则,你只能在本地修改,不能对其的操作push到github远程仓库。而且clone 可以随意clone只要不是在同一目录下多次clone即可。

典型的工作流程和做法是,由于你没有远程仓库的权限,你先在github通过fork,复制自己的一份远程仓库,然后通过clone你自己这个远程副本到本地,进行修改,修改后push到自己的githu远程副本,然后通过github上的Pull request发起请求,这将会把你的修改请求发送到原始的仓库管理者,发出pull request后,github会自动检查冲突,然后通知原始仓库的管理者,有个Pull request,原始仓库管理检查请求,并对变化进行review,然后做出接受或者拒绝你的变更请求。

在线副本(fork)

要开始为项目提供代码,首先需要做一个可以控制的原始项目的在线副本。然后你所有的改变,都可以将其添加到你的在线副本中。然后发起Pull request,发起变化后Githu会自动的将你的在线副本和原始副本进行比较,通知原始项目维护者,由他并决定是否接受你的变更。github的fork操作可以说是git和github变得流行的最重要的功能。鼓励大量用户,不需要加入项目组就可以随时随地的贡献力量。

Git项目文件夹的一般叫"repository"(仓库),简称"repo"。仓库会包含项目的所有源码文件以及git版本信息,Git版本跟踪的文件,git项目文件都位于项目更目录下的.git目录,以及以markdow格式项目说明文档README.md文档。

要创建一个github在线副本,你在原始项目的右上角,点击 "Fork"按钮。

就会会在您的GitHub帐户利用原始仓库的最新版本创建一个在线副本。所有Fork的项目,都会在项目路径下发,有个forked form xxx的原始仓库的链接,比如虫虫这个项目就是fork于perl6/doc的原始仓库。

本地副本(clone)

要对项目进行修改,并对其测试,或者部署一个github项目,你需要的本地clone一个本地副本。在本地副本上,你可以无限制的修改、测试,而无需任何的审批和预先的review。

例如,你要维护一个网站内容,你就可以在本地构建网站副本。然后再本地修改浏览,确保代码完全无误后,再将变化push到远程仓库。你push你的变化后,你们的测试根据你commit(可能关联某个问题或者bug修复),clone一份或者pull一份代码变化到本地,然后测试功能,确保问题解决,或者功能生效。当然这一部分完全可以自动化完成,就是github或者gitlab的CI/CD(持续的集成和发布),虫虫以后会介绍这些内容。

下载到本地的repo的副本称为"clone"。克隆repo与一般的项目下载不一样,除了项目文件本身,clone还会为附带下载仓库的所有版本变化信息。您可以使用git clone url 命令克隆一个仓库,url可以在项目的"clone and down"按钮下找到。

注意Url分两种:https和ssh。如果你clone一个别人共有仓库的时候,只能用https形式,否则你没有任何权限通过ssh clone。

你的单独工作环境(branch)

git项目通常不同的贡献者将对同一个仓库进行大量的更新。为了实现这种特性,git让你可以在同一个仓库创建许多不同版本,脱离主线版本做修改,这些不同版本,称为"分支"。分支管理是git版本控制的最大优势之一,git分支管理基于指针来实现,所以分支的创建,切换和合并都非常快捷,几乎没有任何资源消耗。每个人都可以使用分支创建一个单独的工作环境,对其做任何的修改操作,不影响其他分支版本,当确保没有任何问题时,再通过分支合并,把变化合并到主线版本上来。所有仓库,都会有一个主版本,叫Master,一般也会创建一个Develop分支用来做为开发版本。

分支机构和仓库目录之间的关系

你可能会想把每个分支想象成你的项目文件的不同副本,但技术上分支不是副本,前面我们也说过了,不过是通过用指针将其指到了某个commit下而已。

你将在计算机上的同一目录中与你的仓库中所有分支进行交互。当你在那个目录下时,你总是会看到那个目录的一个版本(一个分支)。

当你切换到一个不同分支时,你目录中的大部分文件也会改变,看起来就像你刚刚选择的版本。但是,如果你保存了对任何文件的更改,则这些更改将与上次保存时保持一致,而不管你检出哪个分支。 Git总能知道你已经更改这些文件,并且正在等待你告诉它哪个版本的项目要添加(git add)更改(或者告诉它你不想保留更改)。

维护人员只能查看已添加到分支的更改。分支告诉他们哪个版本的仓库与他们的哪个版本进行比较。当然你分支除非你push到远程仓库,否则其他任何人都是看不到的。

【转】理清基本的git(github)流程的更多相关文章

  1. 漫谈Github与开源,Git介绍以及Git的思想和基本工作原理 Git工作流程

    漫谈Github与开源 文字亮点: 为什么这些优秀的工程师会开源自己的项目? 因为开源是一种精神. 无数的软件开发者苦心积虑保护自己的代码不被破解,而还是被聪明绝顶的脚本小子破解了,但破解无数软件的脚 ...

  2. git 使用流程(使用代码库github)

    一:先在github 上注册账号,并创建一个项目: 二:mac 命令行-进入自己的工作空间 1:建立库     git init 2:初始化配置 git config --global user.na ...

  3. Github 团队协作基本流程与命令操作 图解git工作流程

    # 先 fork 项目到自己 github # 1. 从自己仓库克隆到本地(clone 的是项目指定的默认分支,比如 master) git clone git@github.com:me/em.gi ...

  4. Git & Github 一页简明笔记

    由于小组工程需要使用git&github的版本控制来协作,但我对其使用并不熟悉,特此写篇一页的笔记放在手边,备随时查阅. 相信这种一页的简明笔记,对大家也是有帮助的.我的笔记总结自廖雪峰的Gi ...

  5. Git & Github 一页简明笔记(转)main

    由于小组工程需要使用git&github的版本控制来协作,但我对其使用并不熟悉,特此写篇一页的笔记放在手边,备随时查阅. 使用方法:常用命令供随时查阅,其余内容供新手了解. 0. 常用命令一览 ...

  6. SourceTree 实现 git flow 流程

    为什么使用 git 和 git flow,这篇文章 深入理解学习Git工作流 的内容相信能够给你一个完整的答案. 我们以使用SVN的工作流来使用git有什么不妥? git 方便的branch在哪里,团 ...

  7. 正确的git开发流程

    正确的git开发流程 第一步 在github中创建一个新的仓库,这时候项目是空的,而且只有一个master分支 第二步 第一个开发人员进来了,他在本地创建一个develop分支,并且提交到远程 git ...

  8. git&github快速掌握

    git&github快速掌握 安装git 版本库创建 代码修改并提交 代码回滚 工作区和暂存区 撤销操作 删除操作 更多操作 Windows下安装git https://gitforwindo ...

  9. 记录自己使用到的git命令行代码与git使用流程

    1.安装创建版本库 新建一个文件夹,用命令行实现: $ cd /d             //进入d盘 $ mkdir gitproject      //新建gitproject文件夹 $ cd ...

随机推荐

  1. mini filter driver sql server

    https://blogs.msdn.microsoft.com/sql_pfe_blog/2013/04/23/identifying-the-cause-of-sql-server-io-bott ...

  2. ny214 单调递增子序列(二) 动态规划

    单调递增子序列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序 ...

  3. ADO.NET 连接方式进行数据库访问

    转自:http://www.cnblogs.com/oneword/archive/2010/09/10/1823414.html 连接到数据源 连接到数据源需要使用两步: 1.创建连接字符串 2.使 ...

  4. 引用第三方高德地图接口---使用js脚本进行开发地图定位的步骤

    ①在高德地图开发平台注册一个账号,获取key ②添加新的key ③引入map插件 ④复制过来map的脚本代码和编写搜索框 <script type="text/javascript&q ...

  5. LeetCode: Surrounded Regions 解题报告

    Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...

  6. 基于CSS3自定义美化复选框Checkbox组合

    今天我们要来分享一组非常漂亮的CSS3自定义复选框checkbox,每一个checkbox都有其各自的特点.有几款checkbox在选中的情况下还会出现动画效果,非常不错的CSS3自定义美化check ...

  7. C语言 · 友好数

    算法训练 友好数   时间限制:1.0s   内存限制:256.0MB      问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1 ...

  8. C# 异常类型

    Exception 类  描述 SystemException 其他用户可处理的异常的基本类 ArgumentException 方法的参数是非法的 ArgumentNullException 一个空 ...

  9. linux支持的内存根文件系统

    linux支持两种内存根文件系统:ramdisk和initramfs. ---------------------------------------------------------------- ...

  10. 【SpringMVC笔记】第五课 改进Handler处理器和视图解析器

    第四课 已经对注解的映射器和适配器进行了改进. 接下来需要对Handler处理器和视图解析器进行改进. <!-- 配置handler处理器 --> <bean class=" ...