如果你曾经经历过"报告-最终版"、"报告-究极进化版"、"报告-打死也不改了版"的噩梦,那你一定能理解版本控制的重要性。Git就是解决这个问题的神器。
作为开源的分布式版本控制系统,Git 是程序员日常开发的必备工具,其核心价值在于高效管理文件版本、支持多人协同开发,还能轻松实现版本回退、撤销修改等操作。
一、Git是什么?为什么需要它?
1.1 问题场景
你是否有过这样的经历:写文档时为了防止丢失或改错,不断复制新文件:
-
报告-v1.docx
-
报告-v2.docx
-
报告-v3.docx
-
报告-确定版.docx
-
报告-最终版.docx
-
报告-究极进化版.docx
文件越来越多,你渐渐忘了每个版本改了什么。想回到某个旧版本?简直大海捞针。
写代码也是一样,项目文件成千上万,如果靠手动备份,根本不可行。
随着版本的不断增多,维护好版本是很有挑战的 。因为各自版本修改的内容需要记录起来,方便我们快速定位并且查阅!!!
1.2 版本控制器登场
版本控制器【记录每次的修改以及版本迭代的一个管理系统】 就是专门解决这个问题的工具。它可以记录一个文件的历史版本,让你随时查看改动、回退到任意时间点,还支持多人协作。
Git是目前最主流的版本控制系统,由Linux之父Linus Torvalds开发。它免费、开源、高效,几乎所有开发者都在用。
注意:Git能跟踪文本文件(如代码、txt、配置文件)的每一次改动,但对于图片、视频等二进制文件,只能记录文件大小变化,无法知道具体改了啥。
Git 的核心特性 & 注意事项
- 支持管理电脑上所有格式文件,对开发人员而言,核心用于管理软件开发的源代码文件;
- Git 只能跟踪文本文件的改动(如 TXT、网页、程序代码),能精准显示修改位置(比如第 5 行加了某个单词);
- 图片、视频等二进制文件,Git 仅能管理其版本(知道文件大小变化),但无法跟踪具体内容修改。

二、Git安装
Git可以在Linux、Mac、Windows上运行。下面介绍常见系统的安装方法。
2.1 Linux-CentOS(以 CentOS7.6 为例)
步骤 1:检查系统是否已安装 Git
git
若输出-bash: git: command not found,表示未安装,执行下一步。
步骤 2:安装 Git
sudo yum -y install git
步骤 3:验证安装 & 查看版本
git --version
输出版本号即安装成功(如git version 1.8.3.1)。
2.2 Linux-Ubuntu(以 Ubuntu20.04 为例)
步骤 1:检查系统是否已安装 Git
git
若输出Command 'git' not found, but can be installed with:,表示未安装。
步骤 2:安装 Git
sudo apt-get install git -y
步骤 3:验证安装 & 查看版本
git --version
2.3 Windows
Windows 平台安装可参考教程链接:https://www.bilibili.com/video/BV1hf4y1W7yT?p=3&vd_source=b57c3f3e8a7507d4af7322c28f05fdbc,按照视频步骤操作即可,安装完成后可在 CMD/PowerShell 中执行git --version验证。
三、创建Git本地仓库
3.1 什么是仓库?
**仓库(repository)就是Git进行版本控制的目录。**你想对哪些文件进行版本管理,就需要先创建一个仓库。
3.2 初始化仓库
在你想管理的项目目录下,执行:
git init
执行后,当前目录下会多出一个.git隐藏文件夹。这个文件夹就是Git的"大本营",里面存储了所有版本历史、配置等信息。千万不要手动修改或删除这个文件夹,否则仓库就坏了。

3.3 配置Git
安装Git后,第一件事是设置你的用户名和邮箱。这些信息会出现在每次提交记录中,让别人知道是谁改的。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
--global表示全局配置,这台电脑上所有仓库都使用这个信息。如果你想让某个仓库使用不同的名字/邮箱,可以去掉--global,并在那个仓库里单独配置。
查看配置
git config -l
删除配置
git config --global --unset user.name
git config --global --unset user.email
四、理解工作区、暂存区、版本库


4.1 三个区域
-
工作区 :就是你电脑上能看到的目录,比如
/home/zs/gitcode,你在里面创建、修改、删除文件。 -
暂存区 :也叫index,位于
.git/index文件中。它是一个临时区域,你先把改动添加到暂存区,之后才统一提交到版本库。 -
版本库 :就是
.git目录,里面存储了所有历史版本。当你执行git commit时,暂存区的内容才被正式保存到版本库中。

- Git 初始化时,会自动创建版本库的唯一默认主分支 master ,以及指向 master 分支的指针HEAD;
- 对工作区的文件进行新建 / 修改后,执行
git add命令,会将文件的改动更新到暂存区;- 执行
git commit命令,会将暂存区 的所有内容正式写入版本库 ,并更新 master 分支和 HEAD 指针;- 仅在工作区新建 / 粘贴文件,不属于 "向仓库添加文件", 必须通过
git add + git commit,才能让文件被 Git 版本库管理。简单总结:工作区写代码 → 暂存区做暂存 → 版本库存版本。
五、添加文件
5.1添加文件与提交版本
git add的常用用法:
git add file1 file2:添加指定文件
git add dir/:添加指定目录(包括子目录)
git add .:添加当前目录下所有改动(包括新增、修改、删除)

5.2 提交暂存区内容到版本库
git commit -m "commit my first file"
-m后面跟的是本次提交的说明信息,一定要写清楚改了什么,方便以后查看。
执行后,Git会告诉你本次提交的摘要:
master (root-commit) c614289\] commit my first file 1 file changed, 2 insertions(+) create mode 100644 ReadMe
5.3 一次提交多个文件
$ touch file1 file2 file3
$ git add file1
$ git add file2
$ git add file3
$ git commit -m "add 3 files"
这样,三个文件都被提交了。
5.4 查看提交历史
- 使用
git log查看历史记录- 如果想更简洁地看,加上**
--pretty=oneline:**
那一长串十六进制数字就是commit id(版本号),是Git根据内容用SHA1算法计算出来的唯一标识。
5.5 注意事项

git add 是将问件添加到暂存区, git commit 是将暂存区的内容添加到本地仓库中。由于我们并没有使用 git add file5 ,file5 就不在暂存区中维护,所以我们 commit 的时候其实只是把已经在暂存区的 file4 提交了,而遗漏了工作区的 file5。如何提交 file5 呢?很简单,再次add , commit 即可。
六、.git 目录
index:就是暂存区,git add后内容更新在这里。HEAD:默认指向master分支的一个指针
refs/heads/master: 文件保存当前master分支最新commit id
objects : 包含了创建的各种版本库对象以及内容,可以以理解为,放了git维护的所有修改
HEAD:指向当前分支的指针。查看它:
$ cat .git/HEAD
ref: refs/heads/master
refs/heads/master:保存master分支当前指向的commit id。
$ cat .git/refs/heads/master
23807c536969cd886c4fb624b997ca575756eed6
这个id就是最新的提交。
objects/:存放所有文件内容、提交对象、树对象等。每个对象以哈希值的前两位作为文件夹名,后38位作为文件名。该类文件是经过sha(安全哈希算法)加密过的文件
- objects 为git 的对象库 ,里面包含了创建的各种版本库对象及内容。**当git add命令时,暂存区的目录树被更新,**同时工作区【修改】或新增的文件内容被写入到对象库中的一个新对象中,就位于 ".git/objects"目录下:

6.1 查看对象的内容
git cat-file -p查看对象的内容。
例如,查看某个commit对象:
$ git cat-file -p 23807c536969cd886c4fb624b997ca575756eed6
tree 830a8c9feefbdc098bbae2cdc25e5034ce1920d7
parent c61428926f3853d4ec6dde904415b0e6c1dabcc6
author hyb91 <2689241679@qq.com> 1683343652 +0800
committer hyb91 <2689241679@qq.com> 1683343652 +0800
add 3 files
接着查看tree对象:
$ git cat-file -p 830a8c9feefbdc098bbae2cdc25e5034ce1920d7
100644 blob 9c9e1f0f6bff3015df71a0963004476f5e6cfd54 ReadMe
100644 blob e69de29bb2d1d6434bb29ae775ad8c2e48c5391 file1
100644 blob e69de29bb2d1d6434bb29ae775ad8c2e48c5391 file2
100644 blob e69de29bb2d1d6434bb29ae775ad8c2e48c5391 file3
再看ReadMe对应的blob对象:
$ git cat-file -p 9c9e1f0f6bff3015df71a0963004476f5e6cfd54
hello git
hello git
原来文件内容就存在这里。Git正是通过这种方式保存每个版本的快照。

