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就是通过日志随意调取近期 的历史状态
==============
=========