内容纲要

🗂 | 本文目录: Git 指南


通过上一篇,你已经知道如何创建一个 Git 仓库了,现在就使用 git init 创建一个然后开始使用它吧。

概念

等等,在开始前你还需要了解一些东西:

Git 的工作流程

Git 项目拥有三个阶段:

  • Working Directory (工作区,也叫工作目录);
  • Staging Area (暂存区);
  • Repository (仓库,也叫 Git 目录);

Git 工作流程是这样的:

  1. 在工作区中修改文件。
  2. 将想要在下次提交的更改选择性地暂存。
  3. 提交更新,将暂存区里的文件永久性存储到 Git 目录。

Git 的文件状态

在电脑上文件管理器进入到的 Git 仓库目录就是上述的「Working Directory」。

在工作目录中的文件分为「未追踪文件 (untracked) 」和「已追踪文件 (tracked )」,所谓的已追踪文件就是被 Git 纳入管理的文件,而未追踪的则没有。

在追踪后,Git 文件一般主要处于 3 种状态:

  • 已修改 (modified);
  • 已暂存 (staged);
  • 已提交 (committed);

实践

用户信息

还记得在《入门》篇提到最小配置时的配置用户信息吗?这里要插一句,如果某个仓库要配置有别于适用于大多数仓库的用户信息时,就可以在这个仓库里进行配置。

假设某个项目是公司项目需要使用公司邮箱,而你在使用 --global 选项配置全局环境的用户信息是个人邮箱。在指定项目仓库里使用 --local 选项进行设置这样项目仓库使用的邮箱就是公司的邮箱了。

确保你已经处于项目目录内,然后:

# 使用 --local 选项
$ git config --local user.name "John Doe"
$ git config --local user.email [email protected]

查看状态

确保你已经处于项目目录内,先使用 git status 命令查看一下现在的状态:

$ git status
位于分支 master

尚无提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

git status 告诉我们目前所处的分支 (master),以及所有已跟踪文件在上次提交后都未被更改过。当然,现在的项目目录中是空的(没有项目文件也没有提交过)。

未跟踪的文件

这时候加入一个说明文件——README.md (这在 Github 上的项目中非常常见,当你需要使用某个项目时阅读它(如果有)是非常必要的),当然它的内容暂时也是空的。

这是一个 Markdown 文件,是一种使用起来易读易写的纯文本格式编写文档,你可以使用如 Typora 这样的编辑阅读器使用它。

然后看一下状态:

$ git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
    README.md

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

这是一个新添加的文件,在以往的记录中并没有(毕竟项目也是全新的),所以目前该文件的状态处于未跟踪 (Untacked),工作目录下的每一个文件只有已跟踪或未跟踪这两种状态。

未跟踪也就意味着之前的提交记录中没有它,所以 Git 也就不会将其纳入跟踪范围。你可能会想为什么不自动的对新文件进行跟踪,因为也存在有你不想让 Git 跟踪的文件的情况。

添加修改至暂存区

所以需要告诉 Git 对新文件建立跟踪,使用 git add <文件名> 命令:

$ git add README.md

💡 小技巧:文件名过长时可以使用 tab 键进行补全。以此为例,在输入到大写的 R 时就可以按下 tab 键,这样就会自动补全完整的文件名,不用一个个手打啦。
如果目录下有多个 R 开头的文件名就需要多打一点直到不相同的字符时再按下 tab 键。

到这里,不仅是对新文件 README.md 进行了追踪,也将其放到了暂存区 (Staging Area) 。

然后接着查看状态:

$ git status
位于分支 master

尚无提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)
    新文件:   README.md

此时 README.md 文件处于「已暂存 (staged)」状态,并且如果觉得准备妥当就可以交到仓库了。

等等,如果此时对文件进行修改呢?比如我在文件内起一个标题,就叫「这是一标题」把

## 这是一个标题

这里类似 Word 里的二级标题,Markdown 中通过井号的数量来表达标题等级,书写和阅读都很方便。

那么再来看一下状态:

$ git status
位于分支 master

尚无提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)
    新文件:   README.md

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
    修改:     README.md

现在,我们提交修改到仓库。那么仓库中 README.md 文件的内容会是添加到暂存区中空白内容的,还是添加到暂存区后在工作区再次进行修改而带有标题的?

提交修改至仓库

使用 git commit -m '<提交信息,在此说明为什么要修改以及修改了什么>' 命令提交修改:

💡 提交信息就是概括描述这次的修改改动,日后查看记录时就可以大致知道这次的历史改动了什么。

$ git commit -m '添加说明文件'
[master(根提交) de4d93a] 添加说明文件
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md

使用 -m 选项就可以在输入命令时顺带输入提交信息,如果不带 -m 选项而只使用 git commit 命令,你将进入到一个交互界面:


# 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 说明将会终止提交。
#
# 位于分支 master
# 要提交的变更:
#       修改:     README.md
#

在这个界面中,需要按下 I 键进入到「编辑模式」,然后就可以写入提交信息,注意井号表示注释,不要在开头也学着下面几行加上井号。

在填写完后按下 Ctrl + C,然后输入 :wq (英文冒号加上 wqw 表示写入 write q 表示退出 quit) 就可以保存退出回到之前的界面了。

查看提交记录

可以使用日志看一下仓库中是否有记录了:

$ git log
commit de4d93a0f98c0657188222bbc0053f6fdc63b4a7 (HEAD -> master)
Author: Conners Hua <[email protected]>
Date:   Wed Jan 29 23:38:05 2020 +0800

    添加说明文件
(END)

通过 git log 可以看到刚才的提交,包含了 commit 的 id、作者及邮箱、提交时间以及提交信息。

接着来看状态

$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
    修改:     README.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

这时候会显示存在「尚未暂存以备提交的变更」,这表示刚才在放入暂存后所做的修改并未提交到仓库中,仓库中的 README.md 文件的内容是空白的。

等等,如果刚才想要提交带有文章标题而不是空白的上去怎么办?使用命令 git add <文件> 再次将工作区中加了标题的 README.md 文件提交到暂存区就好了。

最后,再来捋一捋工作流程:
工作目录 Working Directory (通过命令 git add <文件> 添加文件到)=> 暂存区 Staging Area (通过命令 git commit 提交修改到)=> 仓库 Repository

暂存区的意义

刚接触 Git 的人可能会把 Git 当作一个网盘,把本地工作文件放到一个地方「备份」起来,所以大多会对「暂存区 (Staging Area)」感到迷茫:

为什么要在工作目录和仓库中间放一个好像「多余」的东西?

一般是怎么使用暂存区的?将选定的修改添加到「暂存区」,等准备好作为一个版本提交时,将「暂存区」的修改统一提交为一次历史版本。

在专注项目时,改动可能是同时在多个方面的,有的修改做好了可以提交的准备,而有的没有,也可能同时修改两个部分,但并不能作为一次共同提交。

再以前面的例子为例,在添加到暂存区后仍然可以对工作区中的文件再次修改,那么此时就可以当作成一个备选方案,如果工作区中的方案比添加到暂存区里的更好,就可以替换掉暂存区里的先前添加。

暂存区是一个特别的设计,还有更多的用法,慢慢来。

养成好习惯

现在已经会创建项目、将修改添加到暂存区、将暂存区的修改提交为一个历史。

但一个好的历史提交应该是什么样的?这是一些建议:

  1. 一次历史是一次完整的改动,不要将一件未做完的事情当作一个历史版本;
  2. 一次提交应该只对应一个相关的改动,不要把毫无关联的改动共同提交为一个历史版本。
    例如修改了文章的格式风格与编写了文章的总结内容作为一次提交,那日后想要回滚到文章末尾的这个版本但又不想要所修改的格式时,就需要花费额外的功夫来修改,这也会造成管理混乱;
  3. 写好提交信息,说明为什么需要这次改动以及这次大致改动了什么。这样你或者项目的其他人就可以非常简单的了解你改动的目的以及改动了什么。

小结

命令:

  • git status:显示状态;
  • git log:查看提交历史;
  • git add <文件>:添加文件到索引,也就是暂存区;
  • git commit:记录对仓库的修改;

重点:

  • 工作目录也就是工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改;
  • 暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做「索引 (index)」,不过一般说法还是叫「暂存区 (Staging Area)」。
  • Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
  • 如果 Git 目录中保存着特定版本的文件,就属于已提交状态。 如果文件已修改并放入暂存区,就属于已暂存状态。 如果自上次检出后,作了修改但还没有放到暂存区域,就是已修改状态。