Git系统篇,Git本地使用(一):从“究极进化版“到三个区域的底层原理


文章目录
  • 系列文章目录
  • 前言
  • 一、为什么需要版本控制器
  • [二、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 这几个最核心的操作。

  掌握了这三个区域和这几个基础命令,你就已经能把手头的文件"管"起来了。但光会提交还不够------如果哪天你改崩了想回退,或者想开个分支并行开发,又该怎么办呢?这就是下一节的内容了。

  感谢您的阅读,我们下次再见。


相关推荐
阿明副业观察2 小时前
2026年免费AI视频生成工具功能深度解析:有无水印、中文语音及商业用途考量
大数据·人工智能·ai作画·aigc·音视频·ai写作
shimly1234562 小时前
给断网无 sudo ubuntu22.04 机器安装 nodejs
linux
别动我齐刘海3 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
Lsetea3 小时前
OpenSSL报certificate chain too long:error 22与verify_depth深度排查
linux·https·ssl证书·openssl·证书链
2601_962780913 小时前
2027校招准备:统计学专业如何用数据能力应聘企业经营管理管培生
大数据
宵时待雨4 小时前
GIT版本管理2:远程操作与多人协作
git
阿明副业观察4 小时前
AI视频生成技术全解:生成方法、操作流程与选型指南
大数据·人工智能·ai作画·aigc·ai写作
鬼手点金4 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
不像程序员的程序媛4 小时前
linux常见文本操作命令
linux·运维·服务器