第二章、Git 的基本操作

1. 创建本地 Git 仓库

我们在使用 Git 时需要先创建本地仓库,我们使用本地仓库来存储编写的文件、版本信息,历史记录、分支信息等。本地仓库会自带当前仓库的工作区。我们在工作区内编写代码,然后再提交到本地仓库。这样就完成了文件的管理和版本控制。

创建本地仓库的方法有两种:

  1. 使用 git init 命令将一个本地的文件夹初始化成为一个最原始的空的本地仓库,它也可以将一个已经存在的仓库重新初始化成为空的仓库。
  2. 使用 git clone 命令从一个存在的一个远程仓库克隆成为本地仓库,此本地仓库包含远程仓库的全部信息(包括存储的文件、版本信息、历史记录等)。我们不但能够查看过去的修改历史记录,也能够在此基础上进行改写,然后提交到远处仓库。

1、创建空的 Git 仓库

如果你已经在编写一个项目文件夹,其中的所有文件都没有使用任何的版本控制,现在你想使用 Git 对其进行版本控制,那么你可以使用 cd 命令先进入这个文件夹,然后使用 git init 命令对其初始化成为一个空的 Git 仓库。比如在我的用户主文件夹下,将名称为 my_project 的项目文件夹初始化成为 Git 仓库,在不同的操作系统下用法如下:

Linux 系统

$ cd /home/weimingze/my_project

Mac OS 系统

$ cd /Users/weimingze/my_project

Windows 系统(建议使用PowerShell)

C:\> cd C:\Users\weimingze\my_project

进入 my_project 文件夹后运行 git init 命令,此命令运行成功后,此 my_project 文件夹就成为了一个 Git 仓库。

$ git init

当运行完 git init 后,my_project 文件夹内会新创建一个 .git 的文件夹。这个 .git 文件夹就是当前工程 my_project本地 Git 仓库,其中包含仓库所需要的全部文件。而当前的文件夹 my_project 则用于存放构成该项目的文件,这里称之为工作区(workspace)(不包括 .git 文件夹)。工作区是树形文件结构,因此我们又把工作区叫做工作树(worktree) 。只有工作区内的文件才能纳入 Git 版本控制。

在 Mac OS 和 Linux 系统中以点(.)开头的文件和文件夹是隐藏文件夹。默认不会在终端或文件浏览器中显示。如果你需要查看隐藏文件,你可以使用 命令 ls -a 进行查看隐藏文件

my_project 本地仓库的内部结构如下:

my_project/
└── .git
    ├── HEAD
    ├── branches
    ├── config
    ├── description
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── fsmonitor-watchman.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── pre-merge-commit.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   ├── prepare-commit-msg.sample
    │   ├── push-to-checkout.sample
    │   ├── sendemail-validate.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

通常我们不需要手动修改 .git 文件夹内的内容。要操作此 Git 仓库需要使用 Git 命令。

这样,一个空的 Git 仓库创建完毕。我们接下来就可以将文件加入到此仓库中进行版本控制了。

2、克隆一个已经存在的远程仓库

如果你编写的项目是一个远程多人合作开发的项目。而项目的主仓库是一个远程仓库。如果你需要获取到该项目,并在原有代码的基础上进行修改。你可以使用 git clone 命令来为远程仓库创建一个本地的副本,成为本地仓库。你可以在本地仓库为该项目贡献你自己的代码。在需要时,你还可以将本地仓库的内容推送到远程仓库,实现你对此项目的贡献。

git clone 是为远程仓库创建一个近乎完整的副本,即便远程仓库由于磁盘损坏等导致远程仓库丢失,你也可以使用此本地仓库将远程仓库恢复为 git clone 时的状态。

git clone 命令的用法如下:

git clone 远程仓库的URL地址

如果我要获取我之前用 python 写的一个 2048 的小游戏。这个游戏放在码云平台上。远程仓库的URL地址是 https://gitee.com/weimz/py2048.git。使用如下命令就可以完成此开源项目的复制。

git clone https://gitee.com/weimz/py2048.git

在我的 Ubuntu Linux 上执行效果如下:

weimingze@mzstudio:~$ git clone https://gitee.com/weimz/py2048.git
Cloning into 'py2048'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 19 (delta 1), reused 0 (delta 0), pack-reused 10 (from 1)
Receiving objects: 100% (19/19), 101.91 KiB | 1.82 MiB/s, done.
Resolving deltas: 100% (1/1), done.
weimingze@mzstudio:~$ cd py2048
weimingze@mzstudio:~/py2048$ tree .
.
├── 2048game.py
├── README.md
└── images
    └── demo.png

2 directories, 3 files
weimingze@mzstudio:~/py2048$ tree -a
.
├── .git
│   ├── HEAD
│   ├── branches
│   ├── config
│   ├── description
│   ├── hooks
│      ├── applypatch-msg.sample
│      ├── commit-msg.sample
│      ├── fsmonitor-watchman.sample
│      ├── post-update.sample
│      ├── pre-applypatch.sample
│      ├── pre-commit.sample
│      ├── pre-merge-commit.sample
│      ├── pre-push.sample
│      ├── pre-rebase.sample
│      ├── pre-receive.sample
│      ├── prepare-commit-msg.sample
│      ├── push-to-checkout.sample
│      ├── sendemail-validate.sample
│      └── update.sample
│   ├── index
│   ├── info
│      └── exclude
│   ├── logs
│      ├── HEAD
│      └── refs
│          ├── heads
│             └── master
│          └── remotes
│              └── origin
│                  └── HEAD
│   ├── objects
│      ├── info
│      └── pack
│          ├── pack-bd32d13ce9569d66d6046aea24ac1d72e1c2b0b6.idx
│          ├── pack-bd32d13ce9569d66d6046aea24ac1d72e1c2b0b6.pack
│          └── pack-bd32d13ce9569d66d6046aea24ac1d72e1c2b0b6.rev
│   ├── packed-refs
│   └── refs
│       ├── heads
│          └── master
│       ├── remotes
│          └── origin
│              └── HEAD
│       └── tags
├── 2048game.py
├── README.md
└── images
    └── demo.png

19 directories, 31 files
weimingze@mzstudio:~/py2048$

可见,我将远程仓库 https://gitee.com/weimz/py2048.git 克隆到本地文件夹 py2048 内。在 py2048 文件夹内也有一个 .git 文件夹,这个文件夹就是存放 Git 本地仓库的所需文件的文件夹。这个名为 py2048 的文件夹就是这个项目的工作区。其中 2048game.pyREADME.mdimages 文件夹都是工作区中的文件,即最后提交的工作区中的文件内容。

其中 2048game.py 是游戏的运行文件。你如果已经安装了 Python 的解释执行器,你可以运行 python3 2048game.pypython 2048game.py 就可以运行这个游戏了

实验:

  1. github 上克隆远程仓库 https://github.com/sqlite/sqlite(因为服务器在国外,可能克隆失败)。
  2. 码云 上克隆魏明择写过的电子书的远程仓库 https://gitee.com/weimz/books.git