Github入门与实践

将敏捷开发导入开发现场的领军人物

以顾问身份就web应用的开发及服务指导过多家企业和团队

图灵社区会员

--------

社会化编程

各位在狭小的空间里呆上一段时间之后 再出门时候

是否有一种豁然开朗的感觉

对日外包出身的我来说  社会化编程 就给了我这种感觉

外包行业在IT界只是极端个例

让全世界码农看自己代码的事情

------

与全世界的开源开发者 交流代码心得

------

编写了小程序却找不到人指点

对某款开源软件的源代码感兴趣 为中意的软件出一份力

日系技术书刊 手把手教学风格

---------

本书有一个供各位实践的网站

-----

读万卷书不如行万里路

-------

支鹏浩

-------

代码审查不到位 审查效率低下

没有一个简单高效 能在一天之内添加多个功能的开发流程

池田大树

---------

《WEB+DB  PRESS》

《详解GIthub----使用Pull  Request打造高效率的软件开发》

---------------、

Github是为开发者提供Git仓库的托管服务

总部位于旧金山

章鱼还是猫的

octocat

---------

https://octodex.github.com/

------------------

为开发者 团队 提供了一系列功能 帮助其提高效率  高品质地写代码

-------

创始人之一  

Chris  Wanstrath

----------

https://github.com/features/hosting

=================

http://www.slideshare.net/rubymeetup/inside-github-with-chris-wanstrath

=============

2013年12月   Github托管的仓库已经超过1000万

========

http://git-scm.com

======

Github是网络上提供Git仓库的一项服务

理解Git就是熟练运用Github的关键所在

==========

群管理  Groupware

CRM  顾客关系管理

等脱颖而出

用于辅助多人协同工作的软件层出不穷 大部分又退出了历史舞台

协作形式变化

=======

然而在以程序员为代表的  软件开发者之间  一直都没有一个用来辅助多人协同编程的关键性软件

软件开发者

版本管理

BUg跟踪系统

代码审查工具

邮件列表

IRC

=============

Pull   Request

在开发者之间引起化学反应的

============

Pull Request 是指开发者在本地对源代码进行更改后 

向Github中托管的GIt仓库请求合并的功能

===============

Pull  Request上通过评论交流

例如 修改了BUG 可以合并一下吗

我搞了一个新的功能可以合并一下吗

===========

开源世界  社会化编程

软件开发方法的一次革命都不为过

Social  coding  社会化编程

以前的Github上就是社会化编程

=======

随着Github的出现  软件开发者们才真正意义上的拥有了代码

世界上任何人都可以比以前更加容易地获得源代码

将其自由更正并加以公开

========

在Github出现之前 软件开发中只有一小部分 人拥有更改源代码的权利 

这个特权阶级掌握着开发的主导权

开发者在改写 发布源代码之外往往需要花更多时间和精力去说服这个特权阶级

导致了许多起初效率很高的流行软件越发保守化  最终被时代所抛弃

=======

如今的IT业界已经没有了终身雇用制

人才流动性日益增大  可以说每个月我们都能在一些著名的开发者的博客中看到

月末刚发布消息 辞职了  月初 又入职了

==========

Git仓库管理功能是Github的核心

因此

使用Github之前必须先掌握Git的相关知识

同时本地设备还要安装Git的环境

------

Git属于分散型版本管理系统

2005年开发了Git的原型程序

Linux的Linus  Torvalds

===========

Linux内核的更新速度在全世界也是首屈一指

势必要一个功能性  的版本管理系统来提高开发速度

=====

当时有树款版本管理软件被开发出来 但是 功能和性能

都差强人意

Subversion

============

Git功能多到夸张

让人觉得至今没能掌握它

削减了笔者在版本管理系统上的时间

http://suversion.apache.org/

==========

版本管理就是管理更新的历史记录

记录一款软件添加或更改源代码的过程

回滚到特定阶段

恢复误删的文件

==========

Github将仓库Fork给了每个用户

Fork就是将Github的某个仓库复制到自己的账户下

Fork出的仓库与原仓库是两个不同的仓库

开发者可以随意编辑

           Github

          Fork

 git--------------->git

     <---------------

             Pull  Request

|                                         |

|                                         |pull  push

|                                         |

开发者                               开发者

 

==============

本地开发环境中有仓库  开发者不必链接远程仓库就可以进行开发

即便是不通过Github

开发者之间也可以push  pull

==========

只要规则得当  分散型同样像集中型那样进行管理

多个仓库并存的概念

  http://msysgit.github.io/

========

Git Bash

============

设置姓名和邮箱地址

================

git  config  --global  user.name   "firstname Lastname"

git  config  --global  user.email   "2232450021@qq.com"

这个命令会在 "~/.gitconfig"中以如下形式输出设置文件

想更改这些信息时候

可以直接编辑这个设置文件

这里设置的姓名和邮箱地址   会用在Git的提交日志上

在上传公开仓库时候

姓名 邮箱会随着提交日志一同被公开

======

代码是全世界看到 尽量用英文

==========

提供命令输出的可读性性

将color.ui设置为auto可以让命令的输出拥有更高的可读性

~/.gitconfig中会增加一行

[color]

  ui=auto

===============

创建Github账户

https://github.com

=============

Github上的随处可见的头像 账户独有的标识

是通过 Gravatar 服务显示的

使用过wordpress的读者可能对它有了解

==========

只要使用创建Github账户注册的邮箱 在Gravatar上设置头像

Github的头像就会变成您设置的样子

=========

运行下面的 命令创建SSH  Key

ssh-keygen  -t  rsa  -C  "2232450021@qq.com"

 

密码需要在认证时输入

=========

id_rsa 文件是私有密钥

id_rsa.pub是公开密钥

============

在github上添加公开密钥 今后就可以用私有密yao 进行认证了

点击右上角 账户设定按钮Account  Settings

选择SSH  keys菜单

点击 Add  SSH Keys之后

Key部分粘贴id_rsa.pub文件里面的内容

 

查看id_rsa.pub文件内容的 方法

cat ~/.ssh/id_rsa.pub

=============

就可以用手中的私钥与Github进行认证和通信了

========

ssh  -T   git@github.com

 

======

===============

使用社区功能

Github以人为焦点

那么在创建账户后不妨试试Follow别人

在用户信息页面的右上角点击如图所示的按钮

=============

对于仓库 也可以使用watch功能获取最新的开发信息

如果您经常使用的某个软件 正在 GIthub上进行开发

不妨去watch一下

-===================

在Github上进行交流时用到的Issue

评论

wiki

都可以用Markdown语法表述

从而进行标记

准确地说应该是 Github  Flavored Markdown

(GFW)语法

该语法是在Markdown语法基础上扩充而来的

但是一般情况下 只要按照原本的MarkDown语法进行描述就可以

使用Github之后 很多文档都需要用Markdown来书写

全世界有大量程序员都在使用Markdown

因此掌握这种语法已经成为程序员的标准技能之一

===============

公开代码 

clone 已有仓库

http://www.ituring.com.cn/article/775
==========

git status

Untracked  files

这个东西还没有添加到Git仓库

git  add  hello.php   到暂存区 再通过  git commit命令提交

暂存区 就是在Index数据结构中 记录文件提交之前的状态

将hello.php 提交到仓库

这样一来  这个文件就进入了版本管理系统的管理之下

今后的更改管理都由Git进行

git  commit  -m "wwjw"

===========

git   log

查看提交日志

=======

专栏  公开的许可协议

即便是在Github上公开了源代码

也不代表着作者放弃了著作权等权利

代码的权利持有人 请选择合适的许可协议

在Github上 有修正BSD许可协议

=====

Apache协议

等多种许可协议

大多数软件都使用mit许可协议

=============

 MIT许可协议具有以下特征

使用没有生命许协议的软件时  以防万一最好直接联系著作者

==============

git push   Github上的仓库就会更新

============

Git  初始化仓库

==============================

实际建立一个目录并初始化仓库

git init

执行这个命令就会生成.git目录

.git目录存着管理当前目录内容所需的仓库数据

称为  附属于该仓库的工作树

文件的编辑等操作 在工作树中进行  然后记录到仓库中

以此管理文件的历史快照   如果想 将文件恢复到原先的状态  可以从仓库中调取之前的快照

在工作树中打开

=====================

git  status 

查看仓库的状态

===========

 工作树和仓库 在被操作的过程中

状态会不断发生变化

=========

git status

结果显示我们

当前正处于master分支下  接着显示了 没有可以提交的内通

所谓提交 commit  是指的是  记录工作树中所有文件的当前状态 。

尚且没有可提交的内容 就是说当前我们建立的这个仓库中还没有记录任何

文件的任何状态

这里我们建立README.md文件作为管理对象 为第一次提交做前期准备

================

git add  像暂存区中添加文件

如果只用Git仓库的工作树创建了文件  那么该文件并不会被记入Git仓库的版本管理对象当中

要想让文件成为Git仓库的管理对象

就需要用git add命令将其加入暂存区

Stage 或者Index

暂存区是提交之前的一个临时区域

===========

git  add  README.md

git  status

==============

README.md文件显示在Changes to be committed

========

git  commit  保存仓库的历史记录

可以将当前暂存区中的文件实际保存都仓库的历史记录中

通过这些记录 我们就可以在工作树中复原文件

=================

刚才我们只简洁 记述了一行提交信息  如果要记录更加详细 不要加 -m

只是git commit

========

中止提交

 

如果在编辑器启动后想中止提交

请将提交信息留空并直接关闭编辑器

随后提交就会被中止

====================

git log 

命令可以查看以往仓库中提交的日志

查看什么人什么时候进行了提交或合并

以及操作前后有什么差别

heijue:django king$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file: king.php

heijue:django king$ git log
commit 719657fd2134fca07a70312c505d1d51c552e61b (HEAD -> master)
Author: flask <2232450021@qq.com>
Date: Thu Jul 12 08:45:36 2018 +0800

eeee

commit dd328e7e00d8bf58329343dd7ae20bc0b1572d13 (origin/master)
Author: flask <2232450021@qq.com>
Date: Wed Jul 11 20:32:00 2018 +0800

diyige

 

=========

哈希值  Git的其他命令中 在指向提交时会用到这个哈希值

虚胖 肌肉松弛

Author  显示了我们给Git设置的用户名  邮箱地址

Date拦中 显示提交执行的日期和时间

===========

只显示提交信息的第一行

=======

如果只想让程序显示第一行简述信息

可以在git log 命令后面加上

--pretty=short

========================

只显示指定目录 文件的日志

=========

只要在git log命令后加上目录名  便会只显示该目录下的日志

如果加的文件 只显示该文件的日志

git  log README.md

============

显示文件的改动  如果你查看提交所带来的改动 可以加上-p参数

文件前后差别就会显示在提交信息之后

git log -p

只看README.md文件的提交日志 以及提交前后的差别

git log -p  README.md

=========

git diff

查看更改前后的 差别

工作树  暂存区  最新提交之间的差别 

==========

git diff

查看当前工作树和暂存区的差别

由于我们尚未用git add命令向暂存区添加任何东西

所以程序只会显示工作树与最新提交状态之间的差别

============

+号标出的是新添加的行

被删除的行 用-表示

=========

查看工作数和最新提交的差别

由于工作树和暂存区的状态并无差别 结果什么都不会显示

要查看与最新提交的差别

不妨养成这个好习惯

执行git commit命令之前 先执行git diff HEAD命令

查看本次提交与上次提交之间有什么差别

别等确认完毕之后再进行提交

这里的HEAD是指向当前分支中最新一次提交的指针

================

分支的操作

====================

在进行多个并行作业时  我们会用到分支

并行开发的过程中 往往同时存在多个最新代码状态

从master分支创建 feature-A分支和fix-B分支  每个

分支中都拥有自己的最新代码

master分支是Git默认创建的 分支

因此 基本上所有的开发都是以这个分支为中心进行的

===========

不同分支 可以同时进行完全不同的 作业

等该分支的作业完成之后 再与master分支合并

比如feature-A分支的作业结束后与master合并

通过灵活运用分支 可以让多人同时高效地进行并行开发

===============

git  branch  显示分支一览表

git branch命令可以将分支名列表显示

同时可以确认当前所在分支

可以看到master分支左侧标有星号

表示这是我们当前所有的分支

也就是说我们正在master分支下进行开发

结果中没有显示其他的分支

==========

git checkout  -b  

创建  切换 分支

如果想以当前的master分支为基础创建新的 分支

我们需要用到git  checkout  -b 命令

=======

切换到feature-A分支并进行提交

======

git checkout -b  feature-A

实际上 连续执行下面两条命令也能收到同样效果

-================

git branch feature-A

git checkout feature-A

创建feature-A分支 并将当前分支切换为feature-A分支

这时候查看分支列表

在这个状态 修改代码  git add代码并进行提交的话

代码就会提交到feature-A分支

这样不断对一个分支 进行提交的操作  称为  培育分支

=============

git add README.md

git commit  -m  "Add  feature-A"

==============

切换到master分支

git checkout  master

===========

然后查看README.md 会发现README.md文件仍然保持原先的状态

并没有被添加文字

feature-A分支的更开不会影响到master分支

=========

git checkout -

切换到feature-A分支

========

- 连字符

==============

Git创建分支不需要链接中央仓库

特性分支

Topic分支

是集中实现单一特性主题  除此之外不进行任何作业的分支

日常开发中往往会创建数个特性分支

同时在此之外再保留一个随时可以发布软件的稳定分支

稳定分支 的角色 通常由master分支担当

=========

即便在开发过程中发现了bug也需要再创建新的分支

在新的 分支中进行修正

========

主干分支

git  merge ----合并分支

========

首先切换到master分支

 

git checkout master

=======

为了在历史记录中明确记录下本次分支合并 创建合并提交 在合并时

加上--no-ff参数

git merge --no-ff  feature-A

=======

默认信息中已经包含了 feature-A分支合并过来的相关内容

所有可以不做任何修改

=======

git  log --graph

以图表形式查看分支

===================

更改提交的 操作

 

========

git  reset  回溯历史版本

=========

可以灵活地操作历史版本 

借助分散仓库地优势

不影响其他仓库的前提下对历史版本进行操作

==========

回溯到创建feature-A分支前

让仓库的HEAD 暂存区 当前工作树回溯到指定状态

 

需要用git  rest  --hard命令  只要提供目标时间点的哈希值 

就可以完全恢复至该时间点的状态

===========

git log 命令只能查看以当前状态为终点的历史日志

所以这里用git  reflog命令

查看当前仓库的操作日志

查看当前仓库执行过的操作的 日志

 

只要不进行Git的GC就是通过日志随意调取近期 的历史状态

 

==============

 

 

=========

 

posted @ 2018-07-11 22:41  duxiao123  阅读(176)  评论(0编辑  收藏  举报