第二章、Git 的基本操作
1. 创建本地 Git 仓库
我们在使用 Git 时需要先创建本地仓库,我们使用本地仓库来存储编写的文件、版本信息,历史记录、分支信息等。本地仓库会自带当前仓库的工作区。我们在工作区内编写代码,然后再提交到本地仓库。这样就完成了文件的管理和版本控制。
创建本地仓库的方法有两种:
- 使用
git init命令将一个本地的文件夹初始化成为一个最原始的空的本地仓库,它也可以将一个已经存在的仓库重新初始化成为空的仓库。 - 使用
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.py、README.md 和 images 文件夹都是工作区中的文件,即最后提交的工作区中的文件内容。
其中 2048game.py 是游戏的运行文件。你如果已经安装了 Python 的解释执行器,你可以运行 python3 2048game.py 或 python 2048game.py 就可以运行这个游戏了
实验: