当我初次接触 git 时,我需要快速学习基本的 git 工作流,以便快速接收一个开源 web 项目维护。但是,我很难理解工作流程,因为我不太了解 git 使用关键点。
fork,clone,pull、branch、保存、测试、add,评论、commit,push(注以上黑体的单词都是 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 到远程仓库,否则其他任何人都是看不到的。