Git 的使用

写一些有关于 Git 的个人使用心得。

什么是 Git

用 AI 的话说,Git 是一个分布式版本控制系统,用来记录代码或文件的修改历史,并支持多人协作开发。

也就是说,Git 的核心功能有两个,一个是版本控制,一个是多人协作

Git 的安装

Windows 系统上并没有自带 Git,它是一个命令行工具,我们需要手动进行安装。

可以访问这个网站下载安装 Git 的最新版本。在安装过程中,如果有“Add to PATH”之类的选项请进行勾选。安装完成后,电脑上会多一个 Git Bash。我们很少直接从这里打开。

因为 Git 是一个命令行工具,所以它不像别的软件一样有一个可以打开并显示的窗口。我们很多操作是直接敲命令运行的。也有一些工具可以让我们直观地看到 Git 的运行,比如 VS Code,后面会进行介绍。

Git 的本地使用

检查安装

很多人提到 Git 就会想到 GitHub。但其实,Git 可以不依赖这些网站,完全在本地运行。这个时候它主要被用来进行版本管理

如果前面“Add to PATH”成功了,我们应该可以直接在电脑的任意一个终端运行 Git。在文件夹空白处右键,“在终端中打开”,然后输入:

git

如果提示的不是“未找到命令”,而是以

usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]
[--no-optional-locks] [--no-advice] [--bare] [--git-dir=<path>]
[--work-tree=<path>] [--namespace=<name>] [--config-env=<name>=<envvar>]
<command> [<args>]

开头的一长串文本,则说明 Git 已经安装成功并可以运行了。

设置本地用户和邮箱

为了在多人协作时知道每一步操作是谁做的,在使用之前需要先配置 Git 的邮箱。

运行以下命令:

git config --global user.name <username>
git config --global user.email <email>

<username><email>替换为自己的用户名和邮箱,敲进去的命令中不需要有尖括号。

要注意,这里的邮箱需要是你在对应远程服务中使用的邮箱。以及这里不会对你的邮箱进行验证,所以按下回车前务必检查是否输入正确。

初始化仓库

接下来介绍仓库和如何初始化仓库。

Git 需要以“仓库”为单位进行版本管理。这个仓库是在电脑中的一个文件夹。一般来说,如果我们有一个项目,那么会在这个项目的根目录进行仓库的初始化。比如,你可以新建一个文件夹,然后在终端中打开它,输入:

git init

按 Enter ,这个文件夹就会被初始化成一个仓库。这时候 Git 会在仓库里新建一个名为 .git 的隐藏文件夹,用来进行版本管理和记录远程地址等。

将文件添加到缓冲区

刚建立仓库,Git 是不知道要追踪哪些文件的。我们可以执行命令:

git add <file>

这条命令的意思是将<file>文件或文件夹加入缓冲区。

如果我们需要把仓库里的所有文件都加入缓冲区,只需要运行

git add .

.表示的是当前文件夹,也就是把当前文件夹下的所有文件加入缓冲区。

需要注意的是,这里加入缓冲区,只对文件的当前状态有效。如果你已经运行了一次git add命令,之后对文件进行了修改,需要再一次运行才能追踪到文件的最新状态。

以及,上面提到了git add .这个命令。如果我们需要追踪仓库里的大部分文件,但有一部分文件始终不追踪,可以在仓库中创建.gitignore文件,让 Git 忽略这些文件,详细介绍在后面。

创建一次提交

Git 的版本管理是以“提交”(commit)为单位的。

当我们完成了这一次所有的修改,运行了git add命令之后,就可以进行一次提交,命令是:

git commit -m "commit message"

其中,commit message需要替换成我们对这一次提交的描述。按下 Enter 之后,就提交完成了。

.gitignore 文件

前面提到了 .gitignore 文件。它的作用就是把不希望进入 Git 追踪的文件排除在外,比如一些操作系统相关的文件、编译的中间产物和不属于代码的结果。其中有些操作系统相关文件可能是隐藏文件,平时看不到,但会被 Git 追踪。

下面这一段是一个比较通用的.gitignore文件,只包含了操作系统的相关文件。

# macOS
.DS_Store
.AppleDouble
.LSOverride
Icon?
._*
.Spotlight-V100
.Trashes
.fseventsd

# Windows
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
[Dd]esktop.ini
$RECYCLE.BIN/
*.lnk

# Linux
*~
.directory
.Trash-*
.nfs*

其他本地使用

Git 在本地还可以进行分支切换/版本回退等,留待大家自行探索。

Git 的远程使用

前面提到,Git 的功能有版本控制多人协作。远程使用就主要是多人协作相关。

选择一个 Git 服务

世界上最知名的 Git 服务商是 GitHub。但其实,提供 Git 服务的服务商有很多,比如GitLabGitee等。

对于文档、博客类的站点,GitHub 的优势是它提供了 GitHub Pages 的功能,可以直接进行静态站点的部署。

新建远程仓库

在网页端点击新建仓库,输入仓库名和仓库描述即可新建仓库。

新建仓库之后,网页端会给出将本地仓库和远程仓库连接的命令。一般有两种类型,分别是将新仓库克隆,和将已有仓库连接到远程。

克隆一个已有的仓库

将远程仓库下载到本地的过程叫“克隆”(clone)。

在对应的仓库页面找到.git结尾的链接,然后在想要放置仓库的文件夹里打开终端,输入:

git clone <remote url>

将“remote url”替换为远程链接,按回车即可。

拉取远程仓库的更新

在协作过程中,一个人编辑远程仓库之后,其他人的本地仓库并不会自动更新。我们需要执行命令:

git pull

这将会从远程拉取最新的更新。

将更新推送至远程仓库

在本地完成更新,commit 了之后,需要将更新推送至远程仓库。执行命令:

git push

即可。

对自己没有权限编辑的仓库做操作

git push 命令只能对自己有权限编辑的仓库做推送。如果是别人的仓库,自己没有编辑权限,则需要先在网页Fork对应的仓库到自己的账户下,然后把自己的远程仓库链接添加到本地仓库,对自己的仓库做 push。

Push 至远程后,到网页端对方的仓库新建一个 Pull Request,请求对方拉取你的仓库。对方经过审查之后,就会拒绝这个PR或者合并这个PR

工作流程图

flowchart LR
    A((新建仓库)) --> B[clone]
    B --> C[建立新分支]
    C --> D[写代码]

    D --> E[git add]
    E --> F[git commit]
    F --> G[git push]

    G --> H[合并分支]
    F --> H
    H --> G
flowchart LR
    A((Fork仓库)) --> B[clone]
    B --> C[建立新分支]
    C --> D[写代码]
    D --> E[git add]
    E --> F{已完成?}

    F -- No --> D
    F -- Yes --> G[git commit]
    G --> H[git push]
    H --> I[提交PR]
    I --> J[同步原仓库]

在 VS Code 中使用 Git

现在很多IDE都支持图形方式进行 Git 的版本管理。这里以 VS Code 为例。

在 VS Code 左侧菜单栏中有一个“源代码管理”的按钮,点击它,或者按下快捷键Ctrl+Shift+G,打开面板。

如果当前工作区已经是 Git 仓库,在上半部分会显示当前的更改,下半部分会显示 Git 的提交记录。

我们完成内容编辑后,在“更改”选项卡右侧有个“+”号,点击之后暂存所有更改。然后在“消息”中输入 commit message,点“提交”,就完成了提交。然后点击“同步”,就完成了本地仓库和远程仓库的同步。

命令速查

本地操作

  • git init:初始化仓库

  • git add <file>:将仓库里的<file>文件加入暂存区

  • git commit -m "commit message":将当前暂存的文件提交,

  • git checkout <branchname> 切换分支

  • git stash 暂存工作区

远程操作

  • git clone 将远程仓库克隆到本地

  • git pull 拉取远程仓库的更新,相当于fetch+merge

  • git remote add <name> <url> 给本地库添加一个远程链接

  • git fetch 获取远程仓库的更新

  • git rebase 变基

  • git merge 合并

  • git push 将本地仓库的更新推送到远程

结语

Git 还有很多其他功能,在这里没有写出来,留待前辈们自行探索。