概述

当我初次接触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. zookeeper 安装 配置集群

    https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ [root@znode01 src]# tar -xzvf zookeeper--alph ...

  2. 每日英语:Why Are Items Pricier in China?

    In China, consumers pay nearly $1 more for a latte at Starbucks than their U.S. counterparts. A Cadi ...

  3. Django---ORM操作大全

    前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MyS ...

  4. feginclient和hystrix的配置

    1.如果设置了 feign: hystrix: enabled: true 则 @FeignClient(value = "service-hi",configuration = ...

  5. web.xml 基本配置

    session timeout 配置 <session-config> <session-timeout>5</session-timeout> </sess ...

  6. 找你妹+ipad+wifi,回顾那年的经典游戏

    昨天,不是从前天同事拿平板给我后,就没睡过一个安稳觉. 先是看电视看得爽歪了,再就是昨天晚上的游戏之夜.IPAD比較老.连系统都不好更新了.就用了留存的应用. 打开酷我看看有什么音乐推荐,听到一首&l ...

  7. 3DS更新R4烧录卡内核

    机子是N3DSLL,用的R4烧录卡是银卡HK版. 关于R4烧录卡的基础知识科普贴: https://tieba.baidu.com/p/4855297365 为了防止该网页挂掉还是存图吧. 找最新内核 ...

  8. Linux 系统串口信息查看

    先确认系统启动的时候串口的信息. ECM_5412@chenfl:~$ dmesg | grep tty [ 0.000000] console [tty0] enabled [ 2.511678] ...

  9. RP2833 FPGA对应串口标识

    U41 FPGA-TXD0         /dev/ruart0        FPGA-RXD0      U40 FPGA-TXD1         /dev/ruart1 FPGA-RXD1

  10. ExtJs Ext.data.Model 学习笔记

    Using a Proxy Ext.define('User', { extend: 'Ext.data.Model', fields: ['id', 'name', 'email'], proxy: ...