Power Git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。我们可以用 Git 来管理自己的项目以及其它的一些需要记录历史版本信息的文件。本文为你介绍 Git 的安装和一些常见情况下的使用方法。

本文所说的 Git 是指 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的分布式版本控制软件,而不是全球最大的同性交友代码托管网站 GitHub

Git介绍

版本控制工具记录着项目随着项目的推进所进行的所有的更改。有了版本控制工具,开发者可以自信的增加新的项目内容、删除无用的项目内容和调试 Bug,因为他们可以自由的将项目回退到任意的时刻。

假设你现在正在开发一个项目,经过了一天的忙碌,完成了项目要求的A,B,C功能。到了第二天,你发现项目并不需要B功能,想要删除B功能,但是又害怕以后会用到B功能,所以你新建了一个名为项目(副本)的文件夹来存储带有功能B的项目,然后在原项目的基础上删除了B功能。到了第三天,经过了一天的忙碌,你完成了项目要求的D功能,你想着项目文件需要备份一下,所以新建了一个项目(副本2)的文件夹来备份项目。经过了一星期之后,你发现电脑磁盘里充满着项目(副本*)的文件夹,此时你想重新为项目增加原先删除的B功能,但你已经记不清楚含有B功能的项目文件保存在了哪个文件夹里,只好一个一个的去找。

最后你发现随着项目的推进,备份文件越来越多,你想删除一个,只保留最新的更改,但是又害怕以后会用到之前的文件。最要命的是,你在开发的过程中,遇到过一个 Bug,你把项目代码拷贝给了你的同学后继续进行你的开发。第二天,他调试完 Bug 后把代码发给了你,你发现你得回忆起在把代码给他的期间你对代码进行了哪些更改,并需要把你们的更改合并起来。

此时,你想,如果有一个软件可以自动记录我开发项目的过程,可以让我在项目的历史版本中间穿梭自如,可以自动合并我和我同学同时对代码所作的改动就好了……

Git 就是这样的一个工具。Git 是 Linus Torvalds 用 C 语言开发的,因为 Linus Torvalds 认为 C++ 是邪教😲

Git安装

Git 在 Microsoft Windows、Linux 以及 MacOS 上都有发行版,你可以在 Git 下载页面下载安装你所需要的对应版本。

Git使用

Git 称一个项目为仓库(英文名 repository)。仓库里面存放着有关项目的所有信息和它们对应的历史版本信息。文件的历史版本信息看起来像是一个快照,Git 称其为提交(英文名 commits)。commits 之间的关系就像是链接在一起的列表,它们也可以被组织成并行的链表样式,这样每一个链称作为一个分支(英文名 branches)。由于 Git 是一个分布式的版本控制系统,因此每个仓库都包含项目存放在仓库里的所有信息,且所有的仓库都是平等的。

初始化一个仓库

如果你现在从零开始开发一个项目,你需要首先初始化一个仓库。新建一个存放项目的文件夹,起上一个符合项目气质的名字,然后切换到项目文件夹下,初始化一个仓库:

所在目录:~/project/
1
git init    % 初始化一个仓库

如果你是接着已有的项目继续进行开发,则需要克隆已有的项目:

所在目录:~/project/
1
git clone /path/to/repository    % 克隆一个仓库

如果你克隆的仓库存储在远端服务器,则仓库的路径/path/to/repository需要改为远端服务器提供的仓库路径

如果你正在开发一个项目,但是项目的远端仓库位置发生了更改,你需要添加远端仓库:

对于个人开发者,也建议使用远端仓库,这时候远端仓库主要起到备份的作用,以在本地开发环境遭到破坏的时候仍然可以无中断的进行开发;对于团队协作来说,远端仓库的重要性就不言而喻了

所在目录:~/project/
1
git add /path/to/remote_repository    % 增加一个远端仓库

进行开发

你开发了一些新功能,想要把项目的改动存储在仓库里:

所在目录:~/project/
1
git add <file_name>    % 只暂存<file_name>

或者

所在目录:~/project/
1
git add *    % 暂存所有发生更改了的项目文件

然后你需要把暂存的项目提交到仓库:

所在目录:~/project/
1
git commit  -m "commit message"  % 提交改动

现在,你已经将想要存储的项目信息提交到了本地仓库中。但是远端仓库(如果有的话)并没有发生改变。如果想要把改动推送到远端仓库,你首先需要有读写远端仓库的权限,一般通过添加 ssh 密钥来获取权限:

所在目录:~/project/
1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

如果你已经拥有 ssh 密钥,则不需要生成密钥,直接将公钥放在远端服务器上即可

接着命名密钥文件并设置访问密码。然后将 ssh 生成的公钥放在远端服务器上以获取仓库的读写权限。

在获取了远端服务器中仓库的读写权限后,就可以将项目推送到远端仓库中去了:

所在目录:~/project/
1
git push     % 将本地仓库的改动同步到远端仓库

在任何情况下,想查看仓库中暂存的项目情况、项目的改动情况以及仓库的其它信息:

所在目录:~/project/
1
git status    % 查看仓库信息

一般情况下,在开发一个项目时,一个较好的习惯时是:在前一天的工作结束后,将自己在本地仓库进行的所有改动推送到远端仓库中去,这时的推送操作起到一个备份的功能:

所在目录:~/project/
1
git push    % 将本地仓库的改动同步到远端仓库

在第二天进行工作时,打开电脑后的第一件事情是将远端仓库的内容拉取到本地仓库,此时的拉取操作起到同步的作用:

所在目录:~/project/
1
git pull    % 将远端仓库的内容拉取到本地仓库

然后继续推进项目。

团队协作

如果你正在和你的团队成员一起协作开发一个项目,版本控制工具可以很好的帮助你的团队管理项目文件。一般的,你们需要一个团队所有成员都能访问的服务器来单独存放仓库,在这里称此仓库为远端仓库。团队中会有一个成员来初始化仓库,然后其它的成员通过克隆远端仓库到本地来创建本地仓库。

在进行开发的时候,所有的团队成员都需要在一天的工作之后,将自己对项目所做的改动推送到远端仓库。在第二天进行开发的时候,首先将远端仓库拉取到本地仓库,然后再进行开发。

一般情况下,不同的团队成员会开发不同的项目功能,在不同的项目文件上进行操作,因此你们很少会在开发的时候同时对一个文件进行更改。但是,不同的成员在同一天对同一个文件进行更改也是时常会发生的。Git称上述的情况为冲突(英文名 conflict),在你进行提交操作的时候,就需要对这些改动进行合并(英文名 merge)。一般情况下,针对不同的文件同时进行的更改,Git 可以自动的进行处理。但是,在针对同一个文件进行的改动的情况下,Git 需要开发者来决定如何解决冲突。

上面只是简单的介绍了有关一些简单场景下的 Git 使用,如果你遇到一些复杂的场景,包括但不限于:发生了冲突、在不同的分支上进行开发、使用 Git Flow 进行开发等其它的复杂场景,我在文末列出了一些参考文献供你参考。

图形化Git客户端

对于专业的开发者,使用命令行来进行操作显得专业而且使用方便,但是对于习惯了图形界面的开发者来说,通过直观好看的界面来进行操作则尽显其优雅。

gitk 和 Git-GUI

Git 自带的图形化客户端,对 Git 命令进行了图形化显示。

GitHub Desktop

代码托管网站 GitHub 提供的图形化 Git 客户端,与 GitHub 集成度很高,也可以结合其它代码托管网站使用。你在 Git 官方书籍 《Pro Git》附录A:其它环境中的 Git 图形界面中可以看到 Git 官方给出的介绍。

Sourcetree

代码托管网站 Bitbucket 提供的图形化 Git 客户端,与 Bitbucket 集成度很高,可以结合其它代码托管网站使用。

除此之外,还有许许多多其它的图形化 Git 客户端,其中既有单一功能的定制工具,也有试图提供 Git 所有功能的复杂应用。 Git 的官方网站整理了一份时下最流行的客户端的清单。 在 Git 的维基站点还可以看到一份更全的清单。

流行的代码托管网站

如果你属于个人开发者,自己搭建一个远端服务器来管理项目显得成本太高。鉴于全世界的开发者都有这样的需求,代码托管网站应运而生,代码托管网站起到了远端仓库的作用。代码托管网站同时还是开源社区的有力贡献者,因着其不对托管在网站上的公开仓库收费。因此对于个人开发者,选择代码托管网站需要考虑自己的创意项目是否可以公开出来与大家共享。好在现有的大多数代码托管网站都开始允许个人开发者或者小型的团队创建免费的私有仓库,但是一般会限制其仓库大小。下面的几个比较流行的代码托管网站,其各有自己的特色。

GitHub

GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。这个页面给出了 GitHub 的付费计划详情。

在被微软收购前,GitHub 不提供免费的私有仓库。如今,GitHub 上的个人开发者也可以免费拥有无数量限制的私有仓库,并且支持最多三人的团队协作。由于 GitHub 现已几乎成为世界上最大的开源项目的存储、分发站点,开发者在 GitHub 上可以对开源项目做出自己的贡献。这些贡献体现着自己的实力,因此如今很多开发者在求职的时候会引以为傲的给出自己的 GitHub 账户主页来展示自己的实力。

Bitbucket

Bitbucket 是另一个知名的代码托管网站,在 GitHub 对于个人开发者账户并不提供免费的私有仓库存储时,大多数开发者会将自己不方便分享的项目存储于此。这个页面给出了 Bitbucket 的付费计划详情。

Bitbucket 提供学术账号和社区账号,使用你都学校邮箱或者你都非盈利组织邮箱注册账号,Bitbucket 会自动将你的账号升级,其享有的权益和标准付费计划一致。在 GitHub 并不提供免费私有仓库的时候,我将自己不方便分享的项目存放在 Bitbucket 上,将可以分享的项目存放在 GitHub 上。

除了上述两个最大的代码托管网站外,还有 GitLabCoding 可以选择。

全文完


参考文献

  1. 图解 Git
  2. Git-Guide
  3. Git 官方书籍《Pro Git》
  4. Git 官方文档
  5. GitHub: Git Handbook
  6. Bitbucket: Git Tutorials