如何创建一个可以用composer安装的php包

composer介绍

关于composer如何安装使用,大家可以到phpcomposer查看文档,这里介绍下如何写个可以使用composer安装的php包

写composer.json

新建一个空目录mkdir libfoo,在libfoo目录下新建一个composer.js文件,内容如下

{
    "name": "gangbo/foo",
    "description": "test description",
    "authors": [
        {
            "name": "gangbo",
            "email": "daigangbo@gmail.com"
        }
    ],
    "autoload": {
         "psr-4": {
            "gangbo\\foo\\": "src/",
            "gangbo\\foo\\test\\": "test/"
         }
    }
}

name 代表这个package的名字,由vendorname/packagename组成。
autoload 里面定义namespace和文件目录的对应关系,可以多个。

编写代码并提交到github

在libfoo/src/目录下新建一个Hello.php

<?php
namespace gangbo\foo;

class Hello
{
    public static function fn()
    {
        echo 'hello: ' . __METHOD__ . "\n";
    }
}

在libfoo/test/目录下新建一个Unit.php

<?php
namespace gangbo\foo\test;
class Unit
{
    public static function fn()
    {
        echo 'hello: ' . __METHOD__ . "\n";
    }
}

提交代码到github,需要提前在github上建好仓库

git init
git add *
git commit -m "init"
git remote add origin git@github.com:gangbo/foo.git
git pull origin master:master
git push origin master:master

提交到packagist

登陆到 packagist ,点击submit把我们的git地址https://packagist.org/packages/submit填写进去并提交。

安装使用

这时其它开发者就可以使用comoser安装你的包了
执行composer require gangbo/foo:dev-master,
这里必须加上dev-master,因为如果不加的话会默认安装该包的稳定版,因为我们这里还没有发布稳定版本。
写个脚本测试下

// test.php
//加载autoload
require __DIR__ . '/vendor/autoload.php';

use gangbo\foo\Hello;
use gangbo\foo\test\Unit;

Hello::fn();
Unit::fn();

执行php test.php 输出结果

hello: gangbo\foo\Hello
hello: gangbo\foo\test\Unit::fn

说明调用成功。

如何安装一个本地的package

修改composer.json文件,添加repositories属性。

{
    "repositories": [
        {
            "type": "path",
            "url": "../../packages/my-package"
        }
    ]
}

修改完后我们就可以在本地执行composer require,composer会从本地文件中做个软连接到vendor目录下。
用这种方式可以非常方便的测试的你的package

centos7下安装php7


距离php7发布已经有近10天的时间了,关于php7超强的性能提升这里就不再阐述了,这篇文章主要记录下在centos7上安装php7,nginx,php-memcached的整个过程,不得不说在centos7上安装php7比在centos6.5上顺利太多了,整个过程也就10分钟多点。

安装centos7,nginx

  • 准备工作,一台新安装的centos7的机器,为了演示方便,我全程使用root用户操作,系统最好是先执行下 yum update
  • 安装 nginx,很简单执行yum install nginx即可。
    启动service nginx start,测试是否启动成功, 测试是否正常,用浏览器访问 http://127.0.0.1。正常的话应该看到一个nginx的欢迎页面。这个页面就是 /usr/share/nginx/html/index.html,可以自行修改测试。

安装PHP7

  • 首先安装一些必须的依赖,这里就不阐述了,后面文章再细说
yum install -y \
gcc-c++ autoconf \
libjpeg libjpeg-devel libpng \
libpng-devel freetype freetype-devel \
libpng libpng-devel libxml2 libxml2-devel \
zlib zlib-devel glibc glibc-devel \
glib2 glib2-devel bzip2 bzip2-devel \
ncurses curl openssl-devel \
gdbm-devel db4-devel libXpm-devel \
libX11-devel gd-devel gmp-devel \
readline-devel libxslt-devel \
expat-devel xmlrpc-c xmlrpc-c-devel \
libicu-devel libmcrypt-devel \
libmemcached-devel
  • 下载php7,并解压
$ cd /usr/src/
$ wget http://cn2.php.net/distributions/php-7.0.0.tar.gz
#解压
$ tar -xzxvf php-7.0.0.tar.gz
$ cd php-7.0.0.0
  • 编译,安装
    具体参数意义以后再说
$ ./configure --prefix=/usr/local/php7 \
--with-mysql-sock --with-mysqli \
--enable-fpm  --enable-soap \
--with-libxml-dir --with-openssl \
--with-mcrypt --with-mhash \
--with-pcre-regex  --with-zlib \
--enable-bcmath --with-iconv \
--with-bz2 --enable-calendar \
--with-curl --with-cdb --enable-dom \
--enable-exif --enable-fileinfo \
--enable-filter --with-pcre-dir \
--enable-ftp --with-gd \
--with-openssl-dir --with-jpeg-dir \
--with-png-dir --with-zlib-dir \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-gd-jis-conv --with-gettext \
--with-gmp --with-mhash \
--enable-json --enable-mbstring \
--enable-mbregex \
--enable-mbregex-backtrack \
--with-libmbfl --with-onig \
--enable-pdo --with-pdo-mysql \
--with-zlib-dir  --with-readline \
--enable-session --enable-shmop \
--enable-simplexml --enable-sockets \
--enable-sysvmsg --enable-sysvsem \
--enable-sysvshm --enable-wddx \
--with-libxml-dir  --with-xsl \
--enable-zip \
--enable-mysqlnd-compression-support \
--with-pear --enable-intl
$ make
$ make install
  • 上面的命令执行完后php7就已经安装在到了/usr/local/php7目录下了。正常的话我们执行下面的命令
$ /usr/local/php7/bin/php -v
PHP 7.0.0 (cli) (built: Dec 13 2015 22:28:12) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
  • 接下来我们要做一些简单配置让php运行更简单
    把php加入到系统环境变量中,做个软链即可
$ ln -sf /usr/local/php7/bin/php /usr/local/bin/php
$ php -v #和之前的/usr/local/php7/bin/php一样

添加php.ini,如果是生产环境则cp对应的php.ini-production

$ cp php.ini-development /usr/local/php7/lib/php.ini
  • 配置php-fpm,先添加配置文件
$ cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
$ cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
$ cp /usr/src/php-7.0.0/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
$ chmod +x /etc/init.d/php-fpm

配置文件添加成功后,我们启动php-fpm

$ service php-fpm start 

php-fpm启动后我们还需要配置nginx才能通过访问php页面,首先确认nginx是启动的。service nginx restart

  • 配置nginx支持php,首先在web目录下新建一个php文件
$ echo '<?php phpinfo();' > /usr/share/nginx/html/info.php

然后访问 http://127.0.0.1/info.php,应该看到一个提示下载的页面。这是因为为nginx现在无法处理php文件,接下来我们配置nginx使其将php访问交给php-fpm处理。在/etc/nginx/nginx.confserver块里面添加下面的配置

location  ~ \.php(/|$) {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

保存退出,并重启nginx

$ service nginx restart

现在重新访问 http://127.0.0.1/info.php应该能看到我们熟悉的页面了。

安装php-memcached

下载php-memcached,从github上下载,记住一定要选择对应的php7分支

$ cd /usr/src
$ git clone  https://github.com/php-memcached-dev/php-memcached.git
$ cd php-memcached/
$ git checkout php7
$ /usr/local/php7/bin/phpize
$ ./configure --with-php-config=/usr/local/php7/bin/php-config
$ make
$ make install

修改php.ini

$ vi /usr/local/php7/lib/php.ini
#在最下面加上
extension=memcached.so

保存并退出,重启php-fpm

$ service php-fpm start

再次访问http://127.0.0.0/info.php,就可以看到memcached已经安装成功了。
以上php7,php7-memcached,nginx就已经安装完成了。


优化

  • 打开opcache,个性php.ini文件
$ vi /usr/local/php7/lib/php.ini
[opcache]
zend_extension=opcache.so #新加此行
opcache.enable=1 #删除此行前面的注释,并将0改为1,启用opcache
opcache.enable_cli=1 #删除此行前面的注释,并将0改为1,在cli模式下启用opcache
opcache.revalidate_freq=10 #可选,设置10s检查一次文件变化

通过 http://127.0.0.1/info.phpphp -i可以看到opcache在web和cli模式下都已经启用了。

Yii2 form布局


在yii2中使用gii生成是表彰格式是完全垂直的,如果想需要label和input平等的,可以这样修改代码

use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
    'id' => 'login-form',
    'options' => [
        'class' => 'form-horizontal',
    ],
    'fieldConfig' => [
        'template' => '{label}<div class="col-lg-6">{input}</div>{hint}{error}',
        'labelOptions' => [
            'class' => 'control-label col-lg-2',
        ],
    ]
]) ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>

    <div class="form-group">
        <div class="col-lg-offset-1 col-lg-11">
            <?= Html::submitButton('Login', ['class' => 'btn btn-primary']) ?>
        </div>
    </div>
<?php ActiveForm::end() ?>

使用Vagrant打造统一的开发环境

  1. 列表项

标签(空格分隔): Vagrant 开发 环境 团队


目前现状

开发环境不一致,Mac,Windows,Linux,虚拟机,服务器...
导致安装升级维护浪费很多时间,不同职责的开发人员互相之间的运行环境很难复用

WHY VAGRANT?

  • Vagrant 提供易配置,复制,携带的工作环境,并且这个环境是一个最标准的
  • 提供一个标准的工作流,最大限度的提高团队的生产效率和灵活性
  • 基于Viturlbox,Vmware,AWS。学习难度小,方便安装基本软件
  • 基于文本的可描述的开发环境,很容易做版本控制

    一次性解决所以繁琐的依赖及其配置。只要配置出标准的开发环境,之后团队中其它开发人员只要使用 vagrant up,就可以创建一个相同的运行环境。 Say goodbye to "works on my machine" bugs.

安装Vagrant

下载,点击安装即可,安装完成后在终端输入 vagrant测试是否安装成功。
安装 virtualbox 。

开始

$ mkdir vagrant_php
$ vagrant init hashicorp/precise32
$ vagrant up
$ vagrant package --output intv_ubuntu.box #打包当前环境,会在当前目录下生成一个intv_ubuntu.box

基础概念

box

是对Vagrant对虚拟机镜像(image)的封装。

$ vagrant box --help #
$ vagrant box list #查看本机的所以box
$ vagrant box add yourboxname basebox #将basebox添加到本机的box中
$ vagrant box remove boxname #移除某个box
$ vagrant repackage boxname virtualbox 0 #需要是vagrantcloud上的box

https://atlas.hashicorp.com/boxes/search

配置文件 Vagrantfile

常用配置

配置端口映射
config.vm.network "forwarded_port", guest: 80, host: 8080
同步目录
config.vm.synced_folder "data/", "/srv/website"

provision

config.vm.provision "shell", inline: <<-SHELL
    echo 'hello vagrant'
SHELL

载入配置

$ vagrant reload --provision

配置多个vm

config.vm.define("web") do |config|
    config.vm.box = "apache"
end

config.vm.define("db2") do |config|
    config.vm.box = "mysql"
end

Vagrant Share

$ vagrant share #需要注册 ,可以通过URL访问
$ vagrant share --ssh #可以远程ssh , 如:vagrant connect --ssh shining-shrew-6248

高级用法

  • 自己创建 baseox
  • Vagrant 版本
  • 多个machine

docker 常用命令


启动docker服务
sudo service docker start
确认docker安装成功
sudo docker info
查看本机已有的镜像
sudo docker images
运行一个docker容器,-i -t代表一个可交互的容器
sudo docker run -i -t ubuntu /bin/bash
启动一个容器
sudo docker start cnt_name
停止一个容器
sudo docker stop cnt_name
attach到一个正在运行的容器
sudo docker attach cnt_name
查看所有容器,-a所有,不加a只现实运行状态的容器

sudo docker ps -a
sudo docker ps -n 5 #显示最后5个容器 

获取更多容器信息
sudo docker inspect cnt_name
删除容器

sudo docker rm cnt_name
sudo docker rm `sudo docker ps -a -q` #删除所有容器,-q表示只返回容器ID

从docker hub 下载镜像
sudo docker pull fedora:21
从dcoker hub 上查找镜像
sudo docker search ubuntu

docker commit 创建镜像

先创建一个容器
sudo docker run -i -t ubuntu /bin/bash
安装nginx

apt-get -yqq update
apt-get -y install nginx
exit

查看容器ID
sudo docker ps -l -q
提交该容器
sudo docker commit 6689b00fa0d2 hankdai/nginx
查看刚提交的容器

sudo docker inspect hankdai/nginx 
sudo docker push hankdai/nginx #推送到docker hub

基于Dockerfile构建镜像

创建我们的第一个Dockerfile
cd static_web
创建Dockerfile,内容如下

# Version : 0.0.1
FROM ubuntu:14.04
MAINTAINER Hand Dai "daigangbo@gmail.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

生成镜像

sudo docker build -t="hankdai/static_web" .

使用刚生成的镜像启动一个容器,设置80映射80,容器名为static_web,并启动nginx

sudo docker run -d -p 80:80 --name static_web hankdai/static_web:v1 nginx -g "daemon off;"

访问http://localhost可以看到

Dockerfile 指令

  • CMD
    指定一个容器启动时要运行的命令,可以被覆盖
  • ENTRYPOINT
    容器在启动时运行的命令,并且不能被覆盖,会被CMD作为
  • WORKDIR
    切换到容器内的一个目录,CMD和ENTRYPOINT命令指定的程序都会在这个目录下执行
  • ENV
    设置一个环境变量,相当于脚本语言里的var关键字
  • USER
    用户指定镜像会以哪个用户去运行
  • VOLUME
    卷功能让我们可以将数据,如源代码,数据库文件添加到镜像中而不是提交到镜像中,并且可以在多个容器中共享这些内容。
  • ADD
    用于将构建环境下的文件和目录复制到镜像中。如 ADD somefile /var/somefile 将构建目录下的somefile拷贝到容器中。
  • LABEL
    为docker镜像添加元数据
  • ...

使用docker创建一个静态网站容器

这章你需要了解nginx的基本使用
Dockerfile内容如下

# Version : 0.0.1
FROM ubuntu:14.04
MAINTAINER Hank Dai "daigangbo@gmail.com"
# 安装nginx
RUN apt-get update && apt-get install -yqq nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80

Yii2-log组件


添加log组件配置

'log' => [
    'traceLevel' => YII_DEBUG ? 3 : 0,
    'targets' => [
        'file' => [
            'class' => 'yii\log\FileTarget',
            'levels' => YII_DEBUG ? ['error','warning','info','trace','profile'] : ['error', 'warning'],
            'categories' => [],
            'logFile' => getenv('LOG_FILE_PATH')?:null,
            'logVars'=> [],
        ],
    ],

],

记录信息Yii::error,Yii::warning,Yii::info等。做开发api时可以在有错误时输出到页面。

$messages = Yii::getLogger()->messages;
print_r($messages);

使用teamviewer远程协助

QQ的远程协助我们大家都用过吧,上手非常简单,但问题是对网络要求很高,在网络一般的情况下非常卡。
下面推荐大家使用的teamviewer更适合远程协助。

teamviewer 简介

teamviwer是一个远程协作的工具,非常强大,可以用于远程协作,远程演示,视音频会议等,官网https://www.teamviewer.com/zhCN/。

teamviewer客户端分类

  • teamviewer 完整客户端
  • TeamViewer QuickSupport ,如果你只需要别人远程帮你解决你电脑的问题,那安装这个就行了
  • TeamViewer Host,用于对远程计算机进行24×7小时全天候访问,如果你希望可以随时连接到家里的电脑,那安装它吧
  • TeamViewer QuickJoin, 如果只是参加会议,安装它吧

远程协作实战

如果你的朋友小明现在想让你帮他看看电脑问题,那你需要以下几步
1. 让小明安装TeamViewer QuickSupport,下载地址 mac版本(https://download.teamviewer.com/download/TeamViewerQS.dmg),windows版本(https://download.teamviewer.com/download/TeamViewerQS_zhcn.exe),下载可能有点慢,可以使用迅雷等下载软件。
2. 你自己安装TeamViewer完整包,下载地址 mac版本(https://download.teamviewer.com/download/TeamViewer.dmg),windows版本(https://download.teamviewer.com/download/TeamViewer_Setup_zhcn.exe)。

  1. 小明安装完后启动TeamViewerQs,界面上会出现一个ID,一个密码,如下图
  2. 小明将ID和密码发送给我,你把小明的ID复制到自己的teamviewer
    ,然后点击到“连接到伙伴”,正常的话会提示你密码,填写密码就可以看到小明的桌面了。

git的一些常用高层命令

git config

  • git config --system:系统配置
  • git config --global:全局配置
  • git config --local:本地配置
  • git config -e:编辑配置文件(可与--system, --global, --local组合使用)
  • git config --unset:删除某个配置
  • git config --get:显示某个配置的值
  • git config -l --list:列出所有配置
  • git config alias
  • git config push.default
  • git config pull.rebase

git log

  • git log --stat:简要显示增改行数统计
  • git log -p --patch:展开每次提交的差异
  • git log --name-status:显示新增、修改、删除的文件清单
  • git log --graph:以一些ASCII字符串表示的简单图形,形式地展示了每个提交所在分支及其分化衍合的过程
  • git log --oneline:以单行的简要方式显示log
  • git log --format=:格式化输出日志
  • git log --grep=:搜索匹配关键字的提交
  • git log --author=:过滤出对应作者的提交
  • git log --pretty=:[oneline, short, full, fuller, raw]
  • git log --since=:某个日期之后的提交
  • git log --until=:某个日期之前的提交

git status

  • git status -s:简化方式输出当前状态信息
  • git status --ignored:显示被忽略的文件

git stage, git add

  • git stage -a:暂存所有文件
  • git stage -u:暂存更新文件(包括删除)
  • git stage -i:以互动方式暂存文件
  • git stage -p:暂存文件的部分改动

git checkout

  • git checkout:汇总显示所有状态
  • git checkout path:对于path使用暂存区的内容覆盖工作区
  • git checkout commit -- path:对于path使用commit的内容覆盖工作区
  • git checkout branch:切换分支
  • git checkout -b branch [start-point]:以start-point创建新的分支branch(默认的start-point是HEAD)

git reset

  • git reset path [reset-point]:使用reset-point的内容覆盖暂存区
  • git reset --mixed [reset-point]:重置版本库的内容为reset-point,暂存区内容也被重置,工作区内容不变(git reset的默认动作)
  • git reset --soft [reset-point]:重置版本库的内容为reset-point,暂存区和工作区的内容都不改变
  • git reset --hard [reset-point]:重置版本库的内容为reset-point,暂存区和工作区的内容均被重置

一个神奇而有用的工具(diff&patch)

diff, patch是*nix系统的工具

  • diff用来对比两个文件的差异
  • patch可以看成是patch的反操作

git diff, git apply

  • 使用git diff和git apply本质上是git对diff, patch的一次再封装
  • 使用git diff生成补丁文件
  • 使用git apply应用补丁文件
  • git diff, git apply面向的补丁文件有一个实际意义上的标准,可以在不同的版本控制软件中交流使用

git format-patch, git am

  • 分别对应git diff, git apply的批量操作
  • 使用git format-patch可以对一批commit生成多个对应的补丁文件
  • 使用git send-mail可以将这些补丁文件发送给项目管理员
  • 项目管理员可以使用git am批量应用补丁
  • 实际上这就是开源软件一种工作流

修改提交历史

使用上一次提交历史git commit --amend

在上一次提交的基础上继续修改、删除、新增文件,提交时加上--amend选项,新提交的内容就会与上次提交的更新进行合并。也可以不做任何改动,直接使用git commit --amend来修改上次提交的说明信息

修改多次提交git rebase -i

git rebase -i [start-commit]..[end-commit]可以对指定范围内的提交进行合并、修改、切割等操作

注意:不管是git commit --amend还是git rebase -i,修改过的commit都会重新计算校验和,所以一定要注意不要去修改已经推送到公共版本库的提交,否则会引起人民群众的公愤。版本库管理员为了安全起见,也可以禁止使用--force选项进行推送,避免这种情况的发生

git的一些常用的工作流

集中式工作流

搭建一个中心版本库,所有成员从这个版本库里面克隆代码。
只使用一个分支master,所有提交均推送到这个分支。
所有成员设置pull.rebase为true,避免非快进式提交。
管理员在中心版本库配置receive.denyNonfastforwards为true,拒绝非快进式的推送。
这种工作流本质上是把git当成svn这种集中式版本控制系统来使用。

  • 优点:项目提交历史完全线性化,因此项目条理十分清晰,管理也十分简单
  • 缺点:模式过于简单,无法适应复杂的开发情景与多变的项目需求
  • 很少有项目只使用这种工作流,但这种工作流常常用来与其它工作流来配合使用

金字塔式工作流

项目有多个版本库,但有一个核心的、权威的版本库。
这个核心的版本库有一小批核心管理员,这些管理员有权限直接向核心版本库推送更新。
这个核心的版本库有一大批项目贡献者,每个贡献者者隶属于某个或某几个核心管理员,核心版本库对这些贡献者开放只读权限。
项目贡献者可以克隆核心库来创建自己的版本库,然后在此版本库上生成贡献代码,或通过pull requests,或通过send mail patch将贡献代码发给核心管理员
核心管理员在审核完贡献代码后,如果代码质量通过,管理员就会将贡献代码合并到核心库的某个分支上

  • 优点:结构灵活多变,可以从横向和纵向上来拓展工作流的结构,可以适应大型项目的复杂情景
  • 缺点:对核心管理员的要求极高
  • 几乎所有的大型开源项目都是使用这种工作流或这种工作流的变种

git-flow

搭建一个中心版本库,中心版本库保持一个长期的、稳定的分支。一般是master,也有项目是stable
中心版本库还会保持一个长期的、但经常更新的分支。一般分支名称是develop
平常情况下都是develop分支在演进,如果有某个特性需要开发,便从develop上分出一条分支feature/xxx。待特性基本开发完成后并入develop分支
如果要准备发布,可以从develop上分出一条分支release/xxx。后期所有和发布相关的提交均推送到这个release分支上。待release分支开发完成,并入develop和master分支。用master分支进行部署
如果生产环境发现紧急bug,从master上切出hotfix/xxx分支,修正后将该分支并入master和develop分支,必要时也并入release分支
定期清除一些过期的feature, release, hotfix分支

  • 优点:中心版本库的主分支只有两条,条理相较简单清晰,起码在人的能力控制范围内,项目成员可以直接参与项目贡献。同时,通过feature, release, hotfix三类分支的配合使用,也能适应复杂的情景
  • 缺点:工作流流程比较复杂,上手不是很容易,同时对项目成员的能力要求比较高。如果项目部署后,经常出现紧急bug,就要频繁的建立hotfix分支,甚至是release分支,一样会扰乱分支历史,难于管理。
  • 适用于小团队的项目开发管理,能适应项目成员能力平均和不平均的情景。同时,sourcetree这款git的图形界面软件也对这种工作流进行了一定程度的封装

cherry-pick

项目中心版本库维持多个长期支持分支,每个分支对应一个测试用例,即平常我们说的测服、真服
用于部署真服的分支一般是master,其它分支名字随意,假定部署测服的分支为develop
平常代码在develop上演进,每个提交必须基于一个主题,这个主题可以是一个特性、一个bug、一个模块、一个功能等等
每个主题必须要有一个唯一性标识,并且这个唯一性标识必须体现在提交说明上
在发布时基于要发布的主题,从develop上筛选出对应的提交,把这些提交分别并入master上,然后进行部署、测试、发布

  • 优点:中心版本库只有若干条主线,并且这些主线的提交历史是完全线性的。条理十分清晰。
  • 缺点:在开发分支的演进模式偏于简单,如果项目成员数过多,会有点适应不了。同时,对提交说明的书写要求很严格,如果漏掉说明,就很难基于主题定位到这个提交。这个可以通过git的钩子系统来检查
  • 这种工作流的单个分支上其实就是集中式工作流,适用于小团队的项目开发管理

git的一些底层命令

  • git rev-parse
  • git cat-file
  • git read-tree
  • git commit-tree
  • git ls-tree
  • git update-index
  • git update-ref
  • git hash-object
  • git reflog