创建代码仓库

BY 童仲毅(geeeeeeeeek@github)

这是一篇在原文(BY atlassian)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2.5 AU)协议共享。

这一章简要地带你了解一些最重要的 Git 命令。在这节中,我会向你介绍开始一个新的版本控制项目需要的所有工具,后面的几节包含了你每天都会用到的Git操作。

在这节之后,你应该能够创建一个新的 Git 仓库,缓存你的项目以免丢失,以及查看你项目的历史。

git init

git init 命令创建一个新的 Git 仓库。它用来将已存在但还没有版本控制的项目转换成一个 Git 仓库,或者创建一个空的新仓库。大多数Git命令在未初始化的仓库中都是无法使用的,所以这就是你运行新项目的第一个命令了。

运行 git init 命令会在你项目的根目录下创建一个新的 .git 目录,其中包含了你项目必需的所有元数据。除了 .git 目录之外,已经存在的项目不会被改变(就像 SVN 一样,Git 不强制每个子目录中都有一个 .git 目录)。

用法

  1. git init

将当前的目录转换成一个 Git 仓库。它在当前的目录下增加了一个 .git 目录,于是就可以开始记录项目版本了。

  1. git init <directory>

在指定目录创建一个空的 Git 仓库。运行这个命令会创建一个名为 directory,只包含 .git 子目录的空目录。

  1. git init --bare <directory>

初始化一个裸的 Git 仓库,但是忽略工作目录。共享的仓库应该总是用 --bare 标记创建(见下面的讨论)。一般来说,用 —bare 标记初始化的仓库以 .git 结尾。比如,一个叫my-project的仓库,它的空版本应该保存在 my-project.git 目录下。

讨论

和 SVN 相比,git init 命令是一个创建新的版本控制项目非常简单的途径。Git 不需要你创建仓库,导入文件,检查正在修改的拷贝。你只需要 cd 到你的项目目录下,运行 git init,你就有了一个功能强大的 Git 仓库。

但是,对大多数项目来说,git init 只需要在创建中央仓库时执行一次——开发者通常不会使用 git init 来创建他们的本地仓库。他们往往使用 git clone 来将已存在的仓库拷贝到他们的机器中去。

裸仓库

-—bare 标记创建了一个没有工作目录的仓库,这样我们在仓库中更改文件并且提交了。中央仓库应该总是创建成裸仓库,因为向非裸仓库推送分支有可能会覆盖已有的代码变动。将-—bare看成是用来将仓库标记为储存设施,而不是一个开发环境。也就是说,对于所有的 Git 工作流,中央仓库是裸仓库,开发者的本地仓库是非裸仓库。

2.2 创建代码仓库 - 图1

栗子

因为 git clone 创建项目的本地拷贝更为方便,git init 最常见的使用情景就是用于创建中央仓库:

  1. ssh <user>@<host>
  2. cd path/above/repo
  3. git init --bare my-project.git

首先,你用SSH连入存放中央仓库的服务器。然后,来到任何你想存放项目的地方,最后,使用 -—bare 标记来创建一个中央存储仓库。开发者会将 my-project.git 克隆到本地的开发环境中。

git clone

git clone 命令拷贝整个 Git 仓库。这个命令就像 svn checkout 一样,除了「工作副本」是一个完备的Git仓库——它包含自己的历史,管理自己的文件,以及环境和原仓库完全隔离。

为了方便起见,clone 自动创建了一个名为 origin 的远程连接,指向原有仓库。这让和中央仓库之间的交互更加简单。

用法

  1. git clone <repo>

将位于 <repo> 的仓库克隆到本地机器。原仓库可以在本地文件系统中,或是通过 HTTP 或 SSH 连接的远程机器。

  1. git clone <repo> <directory>

将位于 <repo> 的仓库克隆到本地机器上的 <directory> 目录。

讨论

如果项目在远程仓库已经设置完毕,git clone 是用户获取开发副本最常见的方式。和 git init相似,clone 通常也是一次性的操作——只要开发者获得了一份工作副本,所有版本控制操作和协作管理都是在本地仓库中完成的。

仓库间协作

这一点很重要,你要理解 Git 中「工作副本」的概念和 SVN 仓库 check out 下来的「工作副本」是很不一样的。和 SVN 不同的是,Git 不会区分工作副本和中央仓库——它们都是功能完备的 Git 仓库。

这就使得 Git 的协作和 SVN 截然不同。SVN 依赖于中央仓库和工作副本之间的关系,而 Git 协作模型是基于仓库和仓库之间的交互的。相对于 SVN 的提交流程,你可以在 Git 仓库之间 pushpull 提交。

2.2 创建代码仓库 - 图2

2.2 创建代码仓库 - 图3

当然,你也完全可以给予某个特定的仓库一些特殊的含义。比如,指定某个 Git 仓库为中央仓库,你就可以用 Git 进行中央化的工作流。重点是,这是通过约定实现的,而不是写死在版本控制系统本身。

栗子

下面这个例子演示用 SSH 用户名 john 连接到 example.com,获取远程服务器上中央仓库的本地副本:

  1. git clone ssh://john@example.com/path/to/my-project.git
  2. cd my-project
  3. # 开始工作

第一行命令在本地机器的 my-project 目录下初始化了一个新的 Git 仓库,并且导入了中央仓库中的文件。接下来,你 cd 到项目目录,开始编辑文件、缓存提交、和其它仓库交互。同时注意 .git 拓展名克隆时会被去除。它表明了本地副本的非裸状态。

  1. git config

git config 命令允许你在命令行中配置你的 Git 安装(或是一个独立仓库)。这个命令定义了所有配置,从用户信息到仓库行为等等。一些常见的配置命令如下所列。

用法

  1. git config user.name <name>

定义当前仓库所有提交使用的作者姓名。通常来说,你希望使用 --global 标记设置当前用户的配置项。

  1. git config --global user.name <name>

定义当前用户所有提交使用的作者姓名。

  1. git config --global user.email <email>

定义当前用户所有提交使用的作者邮箱。

  1. git config --global alias.<alias-name> <git-command>

为Git命令创建一个快捷方式(别名)。

  1. git config --system core.editor <editor>

定义当前机器所有用户使用命令时用到的文本编辑器,如 git commit<editor> 参数用编辑器的启动命令(如 vi)替代。

  1. git config --global --edit

用文本编辑器打开全局配置文件,手动编辑。

讨论

所有配置项都储存在纯文本文件中,所以 git config 命令其实只是一个提供便捷的命令行接口。通常,你只需要在新机器上配置一次 Git 安装,以及,你通常会想要使用 --global 标记。

Git 将配置项保存在三个单独的文件中,允许你分别对单个仓库、用户和整个系统设置。

  • /.git/config – 特定仓库的设置。
  • ~/.gitconfig – 特定用户的设置。这也是 --global 标记的设置项存放的位置。
  • $(prefix)/etc/gitconfig – 系统层面的设置。

当这些文件中的配置项冲突时,本地仓库设置覆盖用户设置,用户设置覆盖系统设置。如果你打开期中一份文件,你会看到下面这些:

  1. [user]
  2. name = John Smith
  3. email = john@example.com
  4. [alias]
  5. st = status
  6. co = checkout
  7. br = branch
  8. up = rebase
  9. ci = commit
  10. [core]
  11. editor = vim

你可以用 git config 手动编辑这些值。

栗子

你在安装 Git 之后想要做的第一件事是告诉它你的名字和邮箱,个性化一些默认设置。一般初始的设置过程看上去是这样的:

  1. # 告诉Git你是谁
  2. git config --global user.name "John Smith"
  3. git config --global user.email john@example.com
  4. # 选择你喜欢的文本编辑器
  5. git config --global core.editor vim
  6. # 添加一些快捷方式(别名)
  7. git config --global alias.st status
  8. git config --global alias.co checkout
  9. git config --global alias.br branch
  10. git config --global alias.up rebase
  11. git config --global alias.ci commit

它会生成上一节中所说的 ~/.gitconfig 文件。

这篇文章是「git-recipes」的一部分,点击 目录 查看所有章节。

如果你觉得文章对你有帮助,欢迎点击右上角的 Star :star2: 或 Fork :fork_and_knife:。

如果你发现了错误,或是想要加入协作,请参阅 Wiki 协作说明