文章目录
- 系列文章目录
- 前言
- 一、为什么需要版本控制器
- [二、Git 的安装](#二、Git 的安装)
- [2.1 Linux 下安装 Git](#2.1 Linux 下安装 Git)
- [2.2 Windows 下安装 Git](#2.2 Windows 下安装 Git)
- [三、创建本地仓库与配置 Git](#三、创建本地仓库与配置 Git)
- [3.1 git init 创建仓库](#3.1 git init 创建仓库)
- [3.2 git config 配置用户信息](#3.2 git config 配置用户信息)
- 四、工作区、暂存区、版本库
- [4.1 三个区域的定义](#4.1 三个区域的定义)
- [4.2 三个区域的协作流程](#4.2 三个区域的协作流程)
- [4.3 深入 .git 目录](#4.3 深入 .git 目录)
- 五、核心操作:add、commit、status、diff、log
- [5.1 添加文件到仓库](#5.1 添加文件到仓库)
- [5.2 查看状态:git status](#5.2 查看状态:git status)
- [5.3 查看差异:git diff](#5.3 查看差异:git diff)
- [5.4 查看历史:git log](#5.4 查看历史:git log)
- 总结
前言
大家好,我是曦夜日长。不知道你在工作或学习时,有没有遇到过这样的情况:为了防止文档丢失、改错之后能回滚,只能不停地复制副本,于是你的文件夹里就变成了这样:
报告-v1、报告-v2、报告-v3、报告-确定版、报告-最终版、报告-究极进化版......
文件越来越多倒不是问题,真正的问题是:随着版本数量不断增加,你还记得每个版本各自改了什么吗?
文档如此,我们写的项目代码,更是如此。今天这篇文章,我们就从"版本控制器"这个概念讲起,一路拆解到 Git 本地仓库最核心的三个区域,把这套本地版本管理逻辑彻底讲透。
一、为什么需要版本控制器
为了更方便地管理这些不同版本的文件,版本控制器 应运而生。所谓版本控制器,就是能让你了解一个文件的历史以及它发展过程的系统。通俗地讲,就是一个可以记录工程的每一次改动和版本迭代的管理系统,同时也方便多人协同作业。
目前最主流的版本控制器就是 Git。Git 可以控制电脑上所有格式的文件,比如 doc、excel、dwg 等等。对于我们开发人员来说,Git 最重要的作用,就是帮我们管理软件开发项目中的源代码文件。
不过还需要明确一点:所有的版本控制系统,Git 也不例外,其实只能跟踪文本文件的改动,比如 TXT 文件、网页、程序代码等等。版本控制系统可以告诉你每次的改动,比如在第 5 行加了一个单词 "Linux",在第 8 行删了一个单词 "Windows"。
而图片、视频这些二进制文件,虽然也能被版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次的改动"串"起来------也就是只知道图片从 100KB 改成了 120KB,但到底改了啥,版本控制系统不知道,也没法知道。
二、Git 的安装
Git 是开放源代码的代码托管工具,最早是在 Linux 下开发的,后来慢慢被移植到了各个平台。现在,Git 可以在 Linux、Unix、Mac 和 Windows 这几大平台上正常运行。
2.1 Linux 下安装 Git
以 CentOS 为例,安装相当简单。首先试着输入 git,看看系统有没有安装:
bash
$ git
-bash: git: command not found
Linux 会友好地告诉你 Git 没有安装。安装 Git:
bash
sudo yum -y install git
如果是 Ubuntu,安装命令是:
bash
sudo apt-get install git -y
查看 Git 安装的版本:
bash
git --version
2.2 Windows 下安装 Git
Windows 下安装 Git 更加傻瓜式,从官网下载安装包一路下一步即可,装完之后在任意目录右键就能看到 Git Bash Here 和 Git GUI Here 的入口。
三、创建本地仓库与配置 Git
3.1 git init 创建仓库
要先说明的是:仓库是进行版本控制的一个文件目录。我们要想对文件进行版本控制,就必须先创建一个仓库出来。
创建 Git 本地仓库对应的命令为 git init,注意命令要在目标目录下执行:
bash
hyb@server:~/gitcode$ pwd
/home/hyb/gitcode
hyb@server:~/gitcode$ git init
Initialized empty Git repository in /home/hyb/gitcode/.git/
执行完后,当前目录下多了一个 .git 的隐藏文件。.git 目录是 Git 用来跟踪管理仓库的,不要手动修改这个目录里面的文件,不然改乱了,就把 Git 仓库给破坏了。
3.2 git config 配置用户信息
安装 Git 后首先要做的事情是设置你的用户名称 和 e-mail 地址,这是非常重要的。配置命令为:
bash
git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"
# 把 Your Name 换成你的昵称
# 把 email@example.com 换成邮箱的格式,只要格式正确即可
其中 --global 是一个可选项。如果使用了该选项,表示这台机器上所有的 Git 仓库都会使用这个配置;如果你希望在不同仓库中使用不同的 name 或 e-mail,可以不加 --global 选项,但要注意,执行命令时必须处在仓库里。
查看配置命令为:
bash
git config -l
四、工作区、暂存区、版本库
这是 Git 最核心、也最容易让人懵的三个概念,把它们的关系理清,后面所有命令都顺理成章了。
4.1 三个区域的定义
- 工作区: 就是在电脑上你要写代码或文件的目录。
- 暂存区: 英文叫 stage 或 index,一般存放在
.git目录下的index文件(.git/index)中,我们有时也把暂存区叫作索引(index)。 - 版本库: 又名仓库,英文名 repository。工作区有一个隐藏目录
.git,它不算工作区,而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"。
4.2 三个区域的协作流程
- 在创建 Git 版本库时,Git 会自动创建一个唯一的
master分支,以及指向 master 的一个指针叫HEAD(分支和 HEAD 的概念后面再说)。 - 当对工作区修改(或新增)的文件执行
git add命令时,暂存区的目录树会被更新。 - 当执行提交操作
git commit时,master 分支会做相应的更新,可以简单理解为:暂存区的目录树才会被真正写到版本库中。
由此我们便能得知:通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过
git add和git commit命令,才能将文件添加到仓库中进行管理!
4.3 深入 .git 目录
我们来看看 .git 的目录结构(这里只列关键部分):
bash
$ tree .git/
.git/
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
├── index
├── info
│ └── exclude
├── logs
├── objects
└── refs
├── heads
│ └── master
└── tags
在本地的 Git 仓库中,有几个文件或目录很特殊:
- index: 暂存区,
git add后会更新该内容。 - HEAD: 默认指向 master 分支的一个指针。
- refs/heads/master: 文件里保存当前 master 分支的最新 commit id。
- objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 Git 维护的所有修改。
学习过程中,最好能将常见的 git 操作与
.git目录当中结构内容的变化对应起来,这样有利于理解 Git 的细节流程。
五、核心操作:add、commit、status、diff、log
5.1 添加文件到仓库
在包含 .git 的目录下新建一个 ReadMe 文件,我们可以用 git add 命令将文件添加到暂存区:
- 添加一个或多个文件到暂存区:
git add [file1] [file2] ... - 添加指定目录到暂存区,包括子目录:
git add [dir] - 添加当前目录下的所有文件改动到暂存区:
git add .
再使用 git commit 命令将暂存区内容添加到本地仓库:
- 提交暂存区全部内容到本地仓库中:
git commit -m "message" - 提交暂存区的指定文件到仓库区:
git commit [file1] [file2] ... -m "message"
注意
git commit后面的-m选项,要跟上描述本次提交的 message,由用户自己完成,这部分内容绝对不能省略,并要好好描述,是用来记录你的提交细节,是给我们人看的。
例如:
bash
hyb@server:~/gitcode$ vim ReadMe
hyb@server:~/gitcode$ cat ReadMe
hello bit
hello bit
hyb@server:~/gitcode$ git add ReadMe
hyb@server:~/gitcode$ git commit -m "commit my first file"
[master (root-commit) c614289] commit my first file
1 file changed, 2 insertions(+)
create mode 100644 ReadMe
git commit 执行成功后会告诉我们:1 个文件被改动(就是我们新添加的 ReadMe),插入了两行内容(ReadMe 有两行内容)。
我们还可以多次 add 不同的文件,而只 commit 一次便提交所有文件,这是因为需要提交的文件统统被 add 到暂存区中,然后一次性 commit 暂存区的所有修改。如:
bash
hyb@server:~/gitcode$ touch file1 file2 file3
hyb@server:~/gitcode$ git add file1
hyb@server:~/gitcode$ git add file2
hyb@server:~/gitcode$ git add file3
hyb@server:~/gitcode$ git commit -m "add 3 files"
[master 23807c5] add 3 files
3 files changed, 0 insertions(+), 0 deletions(-)
5.2 查看状态:git status
git status 命令用于查看在你上次提交之后是否有对文件进行再次修改。比如我们修改了 ReadMe 文件后:
bash
hyb@server:~/gitcode$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ReadMe
no changes added to commit (use "git add" and/or "git commit -a")
上面的结果告诉我们:ReadMe 被修改过了,但还没有完成添加与提交。
5.3 查看差异:git diff
目前我们只知道文件被修改了,如果能知道具体哪些地方被修改了,就更好了。有同学会说,我刚改的我知道呀!可是,你还记得你三天前写了什么代码吗?或者没写?
bash
hyb@server:~/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index 9c9e1f0..4a97140 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1,2 +1,3 @@
hello bit
-hello bit
+hello git
+hello world
git diff [file] 命令用来显示暂存区和工作区文件的差异,显示的格式正是 Unix 通用的 diff 格式。也可以使用 git diff HEAD -- [file] 命令来查看版本库和工作区文件的区别。
5.4 查看历史:git log
git log 命令用来查看历史提交记录,显示从最近到最远的提交日志:
bash
hyb@server:~/gitcode$ git log
commit 23807c536969cd886c4fb624b997ca575756eed6 (HEAD -> master)
Author: hyb91 <2689241679@qq.com>
Date: Sat May 6 11:27:32 2023 +0800
add 3 files
如果嫌输出信息太多,看得眼花缭乱,可以试试加上 --pretty=oneline 参数:
bash
hyb@server:~/gitcode$ git log --pretty=oneline
23807c536969cd886c4fb624b997ca575756eed6 (HEAD -> master) add 3 files
c61428926f3853d4ec6dde904415b0e6c1dabcc6 commit my first file
需要说明的是,我们看到的一大串类似
23807c5...56eed6的是每次提交的 commit id(版本号)。Git 的 commit id 不是 1、2、3......递增的数字,而是一个 SHA1 计算出来的非常大的数字,用十六进制表示。
总结
这就是本节的全部内容了。我们从"究极进化版"的痛点讲起,一路拆解了 Git 本地仓库的基础:版本控制器的由来、Git 的安装、本地仓库的创建与配置、工作区/暂存区/版本库三个区域的关系,以及 add/commit/status/diff/log 这几个最核心的操作。
掌握了这三个区域和这几个基础命令,你就已经能把手头的文件"管"起来了。但光会提交还不够------如果哪天你改崩了想回退,或者想开个分支并行开发,又该怎么办呢?这就是下一节的内容了。
感谢您的阅读,我们下次再见。