思维导图(以便查阅)

作者:Aaron Dean

1. Git 与 GitHub

Git 是一个分布式版本控制工具(源代码管理工具),由 Linux 的发明者 Linus 编写。与 Git 相对应的 CVS 和 SVN都是集中式版本控制工具。 而GitHub 是开源及私有软件项目代码托管平台,Git是 其支持的唯一版本库格式。理解 Git,是熟练运用 GitHub 的关键所在。

能有一个 Git 仓库的托管服务让自己与朋友轻松分享代码,是GitHub 的创始人之一 Chris Wanstrath 最初的愿望。Git 仓库管理功能是 GitHub 的核心,但GitHub 不仅仅为开发者提供 Git 仓库的托管服务。这里需要将 GitHub 和 Git区分开来。在 Git 中,开发者将源代码存入名叫“Git 仓库”的资料库中并加以使用。而 GitHub 则是在网络上提供 Git 仓库的一项服务。也就是说,GitHub 上公开的软件源代码全部由 Git 进行管理。

将 GItHub 运用到企业中,便会带来与开源软件开发相同的开发模式。

GItHub 为开源世界带来了社会化编程(Social Coding)的 概念。自此,软件开发者们才真正拥有了源代码。世界上任何人都可以比从前更加容易地获得源代码,将其自由更改并加以公开。对于开发者而言,社会化编程的重要意义在于,可以接触日新月异的源代码、技术、设计以及文化,进而改进自己的源代码。GitHub 提供的仓库托管服务以人为中心,是“面向人”的,这与从前的以项目为中心的项目托管服务大不相同。

GitHub 提供的主要功能

  • Git 仓库
  • Organization
  • Issue 功能:将一个任务或问题分配给一个 Issue 进行追踪和管理。
  • Wiki 功能:编写开发文档或手册。
  • Pull Request:开发者想 GitHub 的仓库推送更改或功能添加后,可以通过 Pull Request 功能向别人的仓库提出申请,请求对方合并。

GitHub 的出现,使开发者的协作形式发生了巨大变化。首先,GitHub 的 Pull Request 功能使世界各地的软件开发者能够方便的共同开发软件。Pull Request是指开发者在本地对源代码进行更改后,向 GitHub 中托管的 Git 仓库请求合并的功能。这使得开发者不但能够轻松查看源代码的前后差别,还可以对指定的一行代码进行评论。

任务管理和 BUG 报告可以通过 Issue 进行交互。既可以向单个用户发送通知,也可以同时向多人发送通知。利用这些功能,可以使交流更有效率。如果想向特定用户看,只要用“@用户名”的格式书写,对方便会接到通知(Notifications),查看 Issue。如果想让属于某一组织 (Organization )的所有成员收到通知,可以输入“@组织名”。如果想让某一组织的某团队的所有成员收到通知,可以输入“@组织名/团队”。另外,输入“#编号”,会连接到该仓库所对应的 Issue编号。输入“用户名/仓库名 # 编号”则可以连接到指定仓库所对应的 Issue 编号。只要按照这类特定格式书写便会自动创建链接。

由于 GitHub 也提供了 Wiki 功能,开发者可以轻松创建文档,进行公开、共享。Wiki 更新的历史记录也在 Git 中管理。GItHub 使用GitHub Flavored Markdown(GFM)语法描述用户所有用文字输入的功能。GFM 还有一个特别的功能:在评论中添加文字表情。

在GitHub中,只要将感兴趣的仓库添加至 Watch 中,就可以在 News Feed 查看该仓库的相关信息。

2. 版本控制/管理

要了解 Git,首先需要了解一下版本控制的概念。

版本控制是指一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。简言之,版本管理就是管理更新的历史记录。版本控制系统主要由一下几种:

  • 本地版本控制系统
  • 集中化的版本控制系统(Centralized Version Control Systems,CVCS): 将所有数据集中存放在服务器总,便于管理,但离线状态或无法使用 VPN 时就无法提交,遇到服务器宕机或其他故障导致数据丢失,则会得不偿失。CVS 和 SVN 都是集中化的版本控制系统。
  • 分布式版本控制系统(Distributed Version Control System, DVCS):客户端把代码仓库完整地镜像下来,包括完整的历史记录。 GitHub 将仓库 Fork 给了每一个用户,Fork 就是将 GitHub 的某个特定仓库复制到自己的账户下。由于本地的开发环境中就有仓库,所以开发者不必连接远程仓库就可以进行开发。分布式的重要思想就是多个仓库并存。GIt 就是最流行的分布式版本控制系统。

3. Git 的诞生

2005,由于不能再免费 BitKeeper,为了继续维护Linux 内核,Linux 开源社区(特别是Linus Torvalds)开发了自己的版本系统。他们对新的系统制订了若干目标:速度快、简单设计、对非线性开发模式的强力支持(允许成千上万个并行开发的分支)、完全分布式、有能力高效管理类似 Linux内核一样的超大规模项目(速度和数据量)。

4. Git 的 工作原理

Git对信息的存储和认知方式与众不同。比如:

  • 直接记录快照,而非差异比较

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别是 Git 对待数据的方法与众不同。 从概念上来说,其它大部分系统以文件变更列表的方式存储信息,这类系统(CVS、Subversion、Perforce、Bazaar 等等) 将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异 (它们通常称作 基于差异(delta-based) 的版本控制)。

Git 不按照以上方式对待或保存数据。反之,Git 更像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。

这是 Git 与几乎所有其它版本控制系统的重要区别。 因此 Git 重新考虑了以前每一代版本控制系统延续下来的诸多方面。 Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。

  • 近乎所有操作都是本地执行

在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。除了速度快的特点之外,这也意味着你在离线或者没有 VPN 时,几乎可以进行任何操作。

  • Git 保证完整性

Git 中所有的数据在存储前都SHA-1 散列(hash,哈希)计算校验和,然后以校验和来引用。这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。

SHA-1 哈希是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

  • Git 一般只添加数据

5. Git 初始设置

  • 设置用户名和邮箱
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@example.com"

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

  • 提高输出命令的可读性

6. Git 常用命令

git init——初始化仓库

git status——查看仓库的状态

git add——向暂存区(Stage 或者 Index)中添加文件

git commit——保存仓库的历史记录

  • 记述一行提交信息:-m 参数后的 “First commit”称作提交信息,是对这个提交的概述。
  • 记述详细提交信息:不加 – m,直接执行 g i t c o m m i t命令。
  • 中止提交:如果在编辑器启动后想中止提交,请将提交信息留空并直接关闭编辑器,随后提交就会被中止。
  • 查看提交后的状态:执行完 git commit命令后再来查看当前状态。

git log——查看提交日志

g i t l o g命令可以利用多种参数帮助开发者把握以往提交的内容。

  • 只显示提交信息的第一行:在 git log命令后加上 –pretty=short。
  • 只显示指定目录、文件的日志:在 git log命令后加上目录名或文件名。
  • 显示文件的改动:git log -p

git diff——查看更改前后的差别

git diff命令可以查看工作树、暂存区、最新提交之间的差别。

  • 查看工作树和暂存区的差别
  • 查看工作树和最新提交的差别

7. 分支的操作

master 分支是 Git 默认创建的分支,因此基本上所有开发都是以这个分支为中心进行的。不同分支中,可以同时进行完全不同的作业。等该分支的作业完成之后再与 master 分支合并。通过灵活运用分支,可以让多人同时高效地进行并行开发。

与分支相关的 Git 操作整理如下:

git branch——显示分支一览表

git checkout -b——创建、切换分支

  • 切换到 feature-A 分支并进行提交: git checkout -b feature-A
  • 切换到 master 分支:git checkout master
  • 切换回上一个分支:用“-”(连字符)代替分支名,就可以切换至上一个分支。

主题(Topic)分支

Git 创建分支时不需要连接中央仓库,所以能够相对轻松地创建分支。因此,当今大部分工作流程中都用到了主题(Topic)分支。顾名思义,主题分支就是是集中实现单一主题,除此之外不进行任何作业的分支。在日常开发中,往往会创建数个主题分支,同时在此之外再保留一个随时可以发布软件的稳定分支。稳定分支的角色通常由 master 分支担当。基于特定主题的作业在特性分支中进行,主题完成后再与 master 分支合并。只要保持这样一个开发流程,就能保证 master 分支可以随时供人查看。

主干分支

主干分支是主题分支的原点,同时也是合并的终点。通常人们会用 master 分支作为主干分支。

git merge——合并分支

git log –graph——以图表形式查看分支

8. 更改提交的操作

git reset——回溯历史版本

Git 的另一特征便是可以灵活操作历史版本。借助分散仓库的优势,可以在不影响其他仓库的前提下对历史版本进行操作。

在日志中,我们可以看到 commit、checkout、reset、merge 等 Git 命令的执行记录。只要不进行 Git 的 GC(Garbage Collection,垃圾回收),就可以通过日志随意调取近期的历史状态,就像给时间机器指定一个时间点,在过去未来中自由穿梭一般。即便开发者错误执行了 Git 操作,基本也都可以利用 git reflog命令恢复到原先的状态。

git commit –amend——修改提交信息

git rebase -i——压缩历史

9.远程仓库

远程仓库

远程仓库是与本地仓库相对独立的另一个仓库。我们可以先在 GitHub 上创建一个仓库,并将其设置为本地仓库的远程仓库。为防止与其他仓库混淆,仓库名请与本地仓库保持一致。创建时请不要勾选 Initialize this repository with a README 选项(图 4.8)。因为一旦勾选该选项,GitHub 一侧的仓库就会自动生成 README 文件,从创建之初便与本地仓库失去了整合性。虽然到时也可以强制覆盖,但为防止这一情况发生还是建议不要勾选该选项,直接点击 Create repository 创建仓库。

git remote add——添加远程仓库

git push——推送至远程仓库

git clone——获取远程仓库

git pull——获取最新的远程仓库分支

10. GitHub 介绍

创建一个账户后,就可以开始使用 GitHub 了。

创建仓库(New repository)

  • Repository name
  • Description
  • Public 、Private
  • Initialize this repository with a README(如果想向 GitHub 添加手中已有的 Git 仓库,建议不要勾选,直接手动 push。)
  • Add .gitignore:在初始化时自动生成 .gitignore 文件 。该文件用来描述 Git 仓库中不需管理的文件与目录。这个设定会帮我们把不需要在 Git 仓库中进行版本管理的文件记录在 .gitignore 文件中,省去了每次根据框架进行设置的麻烦。
  • Add a license(许可协议文件):修正 BSD 许可协议、Apache 许可协议、 MIT 许可协议(大多使用)
  • 输入选择都完成后,点击 Create repository 按钮,完成仓库的创建。

连接仓库

公开代码

  • clone 已有仓库
  • 编写代码
  • 提交:通过 git add命令将文件加入暂存区,再通过 git commit命令提交。添加成功后,可以通过 git log命令查看提交日志。提交

(Commit),是指“记录工作树中所有文件的当前状态”。

  • 进行 push:之后只要执行 push,GitHub 上的仓库就会被更新。

键盘快捷键

  • 按下 shift + / 显示快捷键一览表。

工具栏——UI

  • logo
  • Notications:蓝色时表示有未读通知。用户在新建 Issue、被评论、进行 Pull Request 等时都会收到通知。
  • 搜索窗口
  • Explore:从各个角度介绍 GitHub 上的热门软件
  • Gist 功能:主要用于管理及发布一些没必要保存在仓库中的代码,比如小的代码片段等。
  • Blog:到 GitHub 公司官方博客的超链接,GitHub 公司会在上面发布通知。
  • Help:帮助
  • 头像、用户名
  • Create a new…:创建新的 Git 仓库或 Organization,向 Organization 添加成员、小组、仓库,为仓库添加 Issue 或 collaborator 等操作的菜单都聚集在这里。显示内容会根据当前页面不同而改变。
  • Account settings:账户设置页面,如个人信息、安全管理、付费方案的设置。
  • Sign out:退出GitHub。

控制面板——UI

  • News Feed:显示当前已 Follow 的用户和已 Watch 的项目的活动信息,用户可以在这里查看最新动向。将右上角 RSS 标志的 URL 添加到 RSS 阅读器中,还可以通过 RSS 查看。
  • Pull Requests:显示用户已进行过的 Pull Request。
  • Issues:查看用户拥有权限的仓库或分配给自己的 Issue。
  • Stars:以列表的形式显示用户添加了 Star 的仓库。
  • Broadcast:主要用于接收 GitHub 公司发来的通知或使用技巧的小贴士。
  • Repositories you contribute to:显示用户做过贡献的仓库。
  • Your Repositories:按更新时间顺序显示用户的仓库。

Git网上学习资源

https://try.github.io


参考资料:Pro Git

文档协议:(知识共享) CC BY-NC-SA 3.0 许可协议