Git入门

Git 是一个分布式的版本控制系统,提供了丰富的命令方便我们进行操作。这一节只会从 Git 命令的角度去介绍必备的命令和常规的流程,更多 Git 相关的内容可以从如下地址中获取。Git-Book 中文文档地址: https://git-scm.com/book/zh/v2

在开始使用 Git 前,先从官方进行下载,打开 https://git-scm.com/download/win ,下载会自动开始。下载完成后按照提示进行安装。如果使用的是非 Windows 的操作系统,可以从页面 https://git-scm.com/book/zh/v2/ 起步-安装-Git 中了解到更多的安装方式。安装完成后,菜单或桌面上会出现一个 Git Bash 图标,点击运行即可打开 Git 命令界面。下面开始学习必须掌握的 Git 命令。

初次运行配置

安装完 Git 后,应该做的第一件事就是设置用户名称与邮件地址。这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到每一次提交中,不可更改。打开 Git Bash,输入以下命令。

$ git config --global user.name 你的名字
$ git config --global user.email 你的邮箱

设置好之后,还可以通过如下命令查看当前的配置。

$ git config --list
...

$ 后面是自己输入的命令,下面的内容是执行命令输出的结果。

初始化和克隆仓库

在开始使用版本控制前,一般会遇到两种情况:一种是项目刚开始建立,还没有添加版本控制;另一种是已经存在使用 Git 进行版本控制的项目,这种情况下就不需要从头进行建立,直接克隆该项目即可。

  1. 初始化项目

    这是第一种情况,当项目刚刚建立的时候,还没有使用版本控制,这时可以通过 Git 命令将该项目加入到版本控制中。在使用 Maven 进行依赖管理的项目中,有用的文件基本上就是 src 目录和 pom.xml 文件,当在 Eclipse 或其他 IDE 中导入 Maven 项目后,都会在项目根目录下生成大量和 IDE 配置相关的文件,这些配置文件大多依赖于具体的 IDE,有些配置依赖于当前使用的计算机,还有一些可能会随着时间而进行变化。

    这些配置对于项目来说都是无关紧要的东西,只对当前电脑和 IDE 有用。因为每次导入 Maven 项目时,IDE 都能生成这些文件,而且这些文件在换一台电脑的情况下可能会出现各种各样的错误,所以通常情况下我们都会在版本控制中忽略这类文件。除此之外,还有一些特殊文件需要被忽略。在 Git 中配置忽略文件很简单,在项目的顶层目录或者具体某个目录中添加一个名为 “.gitignore” 的文件即可。

    在 Windows 系统上创建该文件时,因为只有后缀没有文件名,因此无法创建成功。这种情况下,打开 CMD 或者 Git Bash,输入下面的命令。

    $ echo'' > .gitignore

    此时就会在当前目录下创建一个空的 .gitignore 文件。针对 Maven 项目以及常见的 IDE,项目根目录下的 .gitignore 文件的配置如下。

    # Created by .ignore support plugin (hsz.mobi)
    ### Example user template template
    ### Example user template
    
    # IntelliJ project files
    .idea
    *.iml
    out
    gen
    
    # Java compile files
    target

    其中以 # 符号开头的是注释,target/、.idea/、.settings/ 用于匹配相对于 .gitignore 所在目录的 3 个目录,*.iml 匹配当前目录下后缀为 .iml 的文件,.classpath 和 .project 则匹配具体的两个文件。

    需要注意的是,一个 * 符号用于匹配文件名称的一部分或完整的文件名,如 docs/ 匹配 docs 目录下面的所有文件,但是不能匹配 docs/aa/aa.html 文件,doc/*.html 可以匹配 docs 目录下所有 .html 后缀的文件,但是不能匹配 docs/aa.txt 文件。两个 * 符号用于匹配 0 个或多个目录,例如 **/foo 匹配所有目录下的 foo 文件或目录,a/**/b 可以匹配 a/b 或 a/x/b、a/x/y/b 等。

    以前面几章中创建的 simple 项目为例,配置好忽略的项目后,当前的项目结构如图11-1所示。

    image 2024 05 24 20 07 44 092
    Figure 1. 图11-1 simple项目结构

    在当前目录中单击鼠标右键打开 Git Bash,输入如下命令。

    $ git init

    执行完该命令后会在当前目录下创建一个隐藏的 .git 目录,这个目录是 Git 用来跟踪当前版本库的,切记不要轻易修改或删除该目录下的内容。此时,当前的目录就可以使用 Git 进行版本控制了,但目前还是一个空的 Git 仓库。后面会继续讲解如何添加文件到仓库。

  2. 克隆本地仓库

    如果要操作的项目已经使用 Git 进行版本控制了,那么便可以使用 git clone 命令将项目克隆到本地,比如之前已经创建了一个 Git 仓库,可以使用 git clone 创建一个本地仓库的克隆版本,命令如下。

    $ git clone /f/simple simple2

    为了避免在相同的目录下进行操作,上面的命令指定了克隆后的文件名为 simple2,其中 /f/simple 是上面创建的 simple 仓库。如果在 Windows 系统上不能确定一个仓库的路径,则可以在仓库的根目录下执行如下命令。

    $ pwd
    /f/simple
  3. 克隆服务器上的仓库

假如要把 GitHub 服务器上的 MyBatis 源码克隆到本地,可以使用如下命令。

$ git clone https://github.com/mybatis/mybatis-3.git

国内访问 GitHub 的速度并不快,MyBatis 项目代码多,并且包含几千条提交记录,因此下载过程可能需要耗费相当长的时间,网络不稳定的情况下还会下载失败。如果通过上面这种方式没有下载成功,还可以通过以下地址下载打包好的源码文件。下载文件到本地并解压后,再参照官方仓库同步到最新版本即可。

当下载完成后,本地就会出现一个 mybatis-3 的目录,可以通过 Maven 方式导入到 Eclipse 中,后续对文件的修改操作可以按照后面的命令进行添加和提交操作。

本地操作

使用 Git 对项目进行版本控制时,基本上都是大量重复的本地操作。最常见的操作就是添加文件到版本控制、提交文件到仓库、查看状态、查看历史记录等。

前面已经创建好了一个空的仓库,现在先通过如下命令查看当前项目的状态。

$ git status
...

命令下面列出了还没有被跟踪的文件和目录,由于使用 .gitignore 配置忽略了 IDE 配置和编译生成的 target 目录,所以此处只列出了 3 项需要跟踪的文件和目录。

执行如下命令添加所有文件到版本控制。

$ git add --all

这个命令只是告诉 Git 要添加什么文件,还没有真正把这些文件添加到仓库中,输入 git status 查看当前的状态,部分显示内容如下。

$ git status
...

此时可以看到这里列出了很多需要被提交的新文件。执行如下命令进行提交。

$ git commit -m '初始导入'
...

使用 git commit 命令提交文件的时候,必须通过 -m 参数指定提交信息。提交后输入 git status 查看当前的状态。

$ git status
...

当前目录没有需要提交的内容,工作目录是干净的。当后续对工作空间的内容进行修改时,状态就会发生改变,基本的操作仍然通过 git add 进行添加,然后通过 git commit 进行提交。

输入 git log 命令查看当前的提交记录。

$ git log
...

远程操作

在本地进行很多操作后,遇到多人协同操作或者需要提交到指定服务器的情况,我们还需要将本地的更改提交到某个仓库或服务器的仓库中,同时还要把他人提交的更改拉取到本地。

与远程服务器进行交互的方式将在下一节 GitHub 中介绍,这里仍然用本地的方式进行操作。

在 Git 中,服务器端的公共仓库必须是一个裸(不是工作目录的)仓库。在分区根目录下,我们创建一个 repo 文件夹,进入该文件夹,执行如下命令创建一个裸仓库。

$ git init --bare
...

回到 simple 目录中,在该目录下执行如下命令。

$ git push /f/repo master
...

将当前项目的 master 分支提交到 repo 仓库中。其他人也可以直接从 repo 中检出项目,对项目进行修改后还可以提交到 repo 仓库。假设其他人有新的提交(可以从 /f/repo 检出一份然后修改后再提交到 repo),本地可以通过以下命令和 repo 仓库进行同步,如果本地和服务器内容一致,就会显示如下。

$ git pull /f/repo master
...

如果服务器有新的内容,则会显示如下。

$ git pull /f/repo master
...

每次和服务器交互时,如果 /f/repo 的名字很长就会不方便,可以通过如下代码给当前的工作空间添加一个远程的源(相当于别名)。

$ git remote add origin/f/repo

通过 git remote -v 可以查看所有远程的源。有了这个短的名字后,上面同步的操作可以如下书写。

$ git pull origin master

Git 最基本的操作就是以上这些,这里并没有涉及分支相关的操作,建议通过阅读 Git-Pro 文档了解更多相关知识。