术语

版本控制系统 / 源代码管理器

版本控制系统(简称 VCS)是一个管理源代码不同版本的工具。源代码管理器(简称 SCM)是版本控制系统的另一个名称。
Git 是一个 SCM(因此也是 VCS!)。Git 网站的 URL 是 https://git-scm.com/ (注意它的域名中直接包含“SCM”!)。

提交(Commit)

Git 将数据看做微型文件系统的一组快照。每次 commit(在 Git 中保持项目状态),它都对文件当时的状况拍照,并存储对该快照的引用。你可以将其看做游戏中的保存点,它会保存项目的文件和关于文件的所有信息。
你在 Git 中的所有操作都是帮助你进行 commit,因此 commit 是 Git 中的基本单位。

仓库(Repository / repo)

仓库是一个包含项目内容以及几个文件(在 Mac OS X 上默认地处于隐藏状态)的目录,用来与 Git 进行通信。仓库可以存储在本地,或作为远程副本存储在其他计算机上。仓库是由 commit 构成的。

工作目录 / 工作区(Working Directory)

工作目录是你在计算机的文件系统中看到的文件。当你在代码编辑器中打开项目文件时,你是在工作目录中处理文件。
与这些文件形成对比的是保持在仓库中(在 commit 中!)的文件。
在使用 Git 时,工作目录与命令行工具的 current working directory (当前工作目录)不一样,后者是 shell 当前正在查看的目录。

检出(Checkout)

检出是指将仓库中的内容复制到工作目录下。

暂存区 / 暂存索引 / 索引(Staging Area / Staging Index / Index)

Git 目录下的一个文件,存储的是即将进入下个 commit 内容的信息。可以将暂存区看做准备工作台,Git 将在此区域获取下个 commit。暂存索引中的文件是准备添加到仓库中的文件。

SHA

SHA 是每个 commit 的 ID 编号。以下是 commit 的 SHA 示例:e2adf8ae3e2e4ed40add75cc44cf9d0a869afeb6。
它是一个长 40 个字符的字符串(由 0–9 和 a–f 组成),并根据 Git 中的文件或目录结构的内容计算得出。SHA 的全称是”Secure Hash Algorithm”(安全哈希算法)。

分支(Branch)

分支是从主开发流程中分支出来的新的开发流程。这种分支开发流程可以在不更改主流程的情况下继续延伸下去。
回到之前关于游戏保存点的示例,你可以将分支看做在游戏中设立保存点后,尝试一个有风险的招式。如果有风险的招式不奏效,则回到保存的位置。令分支非常强大的关键之处是你可以在一个分支上设定保存点,然后切换到另一个分支并继续设定保存点。
了解这些术语后,我们将探寻使用版本控制的一般流程,从更高的层面了解如何使用 Git。

创建Git仓库

git init

创建新仓库
在对 Git 仓库进行 commit 或执行任何其他操作之前,需要一个实际存在的仓库。要使用 Git 新建一个仓库,我们将使用 git init 命令。
init 子命令是”initialize”(初始化)的简称,这个命令很有用,因为它将进行所有仓库初始设置。稍后我们将了解它的作用。

所需的命令

注意!我们将在这节课使用以下终端命令:

  • ls - 用来列出文件和目录
  • mkdir - 用来新建目录
  • cd - 用来更改目录
  • rm - 用来删除文件和目录

我们还会涉及的一个概念是当前目录,即你的 shell 正在查看的目录。使用 cd 可以更改工作目录,使用 ls(单独使用)会列出工作目录下的文件。如果你忘记 shell 的当前工作目录,可以使用 pwd 命令(表示 print working directory 输出工作目录)输出该目录的名称。

git clone

git status

查看仓库的历史纪录

git log

显示仓库的commit

很棒!是不是觉得掌握的 git 知识越来越多了?
我们快速总结下 git log 命令。git log 命令用于显示仓库中所有 commit 的信息。

  1. $ git log

默认情况下,该命令会显示仓库中每个 commit 的:

  • SHA
  • 作者
  • 日期
  • 消息

我强调了“默认情况下”是因为 git log 命令显示的信息远不止这些。
git 使用命令行分页器 less 浏览所有信息。以下是 less 的重要快捷键:

  • 要按行向下滚动,使用 j 或 ↓
  • 要按行向上滚动,使用 k 或 ↑
  • 要按页向下滚动,使用空格键或 Page Down 按钮
  • 要按页向下滚动,使用 b 或 Page Up 按钮
  • 要退出,使用 q

我们将在下节课中提升我们的 git log 使用技巧以显示更多信息。

更改git log显示信息的方式

  1. $ git log --oneline

查看修改后的文件

  1. $ git log --stat
  2. # 推荐
  3. $ git log --oneline --stat

image.png

查看文件具体更改

  1. # p--patch
  2. $ git log --patch
  3. $ git log -p

带注释的 git log -p 输出

我们通过上述图片快速总结下 git log -p 的输出:

  • 🔵 - 正在显示的文件
  • 🔶 - 文件第一版的哈希值和第二版的哈希值
    • 通常不重要,因此可以忽略
  • ❤️ - 文件的旧版本和当前版本
  • 🔍 - 添加的行所在的位置以及添加了多少行
    • -15,83 表示旧版本(用 - 表示)从第 15 行开始,显示了 83 行
    • +15,85 表示当前版本(用 + 表示)从第 15 行开始,现在变成了 85 行…这 85 行显示在下方
  • ✏️ - 在 commit 中实际进行的更改
    • 用红色标示并以减号 (-) 开头的行是位于文件原始版本中,但是被 commit 删除的行
    • 用绿色标示并以加号 (+) 开头的行是 commit 新加的行

      git show

      向仓库中添加commit

      git add

      Add files ffrom the working directory to the staging index

git commit

Taking files from the staging index and save them in the repository

git diff

Display the difference between two versions of a file

.gitignore

通配符速成课程

假设你向项目中添加了 50 个图片,但是希望 git 忽略所有这些图片。这样的话,是否需要将每个文件名都列在 .gitignore 文件中呢?当然不用了,要不然太可怕了!相反,你可以采用一个叫做 通配符(|) 的概念。
通配符允许你使用特殊的字符来表示某些格式/字符。在 .gitignore 文件中,你可以使用:

  • 空白行作为空格
  • - 将行标记为注释

      • 与 0 个或多个字符匹配
  • ? - 与 1 个字符匹配
  • [abc] - 与 a、b 或 c 匹配
  • - 与嵌套目录匹配 - a//z 与以下项匹配
    • a/z
    • a/b/z
    • a/b/c/z

因此如果所有 50 个图片都是 JPEG 图片,并且位于”samples”文件夹中,那么我们可以向 .gitignore 中添加以下行,使 git 忽略所有这 50 个图片。

  1. samples/*.jpg