Git从0到实战(一):认识 Git —— 从"为什么要学"开始

7 阅读14分钟

第一篇:认识 Git —— 从"为什么要学"开始

1. 没有版本控制的日子,有多痛苦?

在讲 Git 之前,我们先聊聊"没有 Git 的世界"是什么样的。你可能已经经历过以下场景:

场景一:论文版本地狱

假设你在写毕业论文:


毕业论文.docx

毕业论文-修改版.docx

毕业论文-修改版2.docx

毕业论文-最终版.docx

毕业论文-最终版-真的最终版.docx

毕业论文-最终版-导师修改后.docx

毕业论文-最终版-导师修改后-我改的.docx

毕业论文-最终版-导师修改后-我改的-真的真的最终版.docx

是不是已经开始窒息了?这还不是最可怕的。最可怕的是:当你打开一个旧版本,发现里面有一段写得非常好的话,但你已经在新版本里删掉了,现在想找回来——你根本不知道那段话在哪个版本里。

场景二:小组作业的噩梦

大二的时候,你和三个同学一起做课程设计。你们的协作方式是:

  1. 张三写登录模块

  2. 李四写首页

  3. 王五写数据库

然后你们通过 QQ 传来传去,最后发现:

  • 张三的代码覆盖了李四的代码

  • 李四的代码不知道咋回事打不开了

  • 王五的数据库连接改了,但没人知道

  • 最后你们被迫通宵,用"三台电脑并排坐"的方式手动合并代码

这就是没有版本控制的真实写照。

场景三:代码写崩了,回不去

你正在写一个功能,写了三天,代码改了几十个文件。突然发现越改越乱,想回到三天前的状态——但你发现做不到。除非你手动备份了副本,否则一切都无法挽回。


2. 版本控制是什么?

版本控制(Version Control),说白了就是:给你的文件存档,并且可以随时翻看任何一个存档、回到任何一个存档。

就像打游戏时的"存档"功能:

  • 打 Boss 前存个档,打不过就读档重来

  • 想尝试不同路线,分别存档,互不影响

  • 玩到一半发现选错了,可以回到之前的存档

Git 就是做这件事的,只不过它比游戏存档强大得多。

版本控制的三个阶段

版本控制系统的发展,大致经历了三个阶段:

| 阶段 | 代表 | 特点 | 缺点 |

|------|------|------|------|

| 本地版本控制 | 手动复制粘贴 | 最简单,自己电脑上存 | 容易乱,多人协作不可能 |

| 集中式版本控制 | SVN(Subversion) | 代码存在中央服务器,大家围绕服务器协作 | 服务器挂了所有人没法干活 |

| 分布式版本控制 | Git | 每个人电脑上都有完整仓库,离线也能干活 | 学习曲线稍陡 |

我们来画一张图理解集中式和分布式的区别:


graph TB

    subgraph 集中式版本控制-SVN

        Server1[中央服务器<br/>完整代码仓库]

        UserA1[用户A<br/>只有最新快照]

        UserB1[用户B<br/>只有最新快照]

        UserC1[用户C<br/>只有最新快照]

        Server1 --- UserA1

        Server1 --- UserB1

        Server1 --- UserC1

    end

在集中式系统中,所有人围绕着中央服务器工作。你每次提交代码,是直接提交到服务器上的。如果服务器挂了(比如 GitHub 今天宕机),你什么都做不了——不能提交、不能看历史、甚至不能切换分支。


graph TB

    subgraph 分布式版本控制-Git

        UserA2[用户A<br/>完整代码仓库<br/>+完整历史记录]

        UserB2[用户B<br/>完整代码仓库<br/>+完整历史记录]

        UserC2[用户C<br/>完整代码仓库<br/>+完整历史记录]

        Remote[远程仓库-GitHub<br/>完整代码仓库]

        UserA2 <--> Remote

        UserB2 <--> Remote

        UserC2 <--> Remote

    end

在分布式系统中,每个人的电脑上都有一个完整的仓库副本,包含了所有的历史记录。远程仓库(GitHub/GitLab)只是一个"共享副本",即使远程仓库挂了,你依然可以:

  • 查看所有历史记录

  • 提交代码(提交到本地仓库)

  • 切换分支

  • 查看任何版本的代码

等远程仓库恢复了,再把本地的提交同步上去就行了。


3. Git 是谁发明的?

这个问题面试可能会问,而且答案很有意思。

Git 的创造者是 Linus Torvalds——也就是 Linux 操作系统的创始人。

2005年,Linux 内核社区之前使用一个叫 BitKeeper 的商业版本控制工具。后来因为一些版权纠纷,BitKeeper 收回了免费使用权。Linus 一怒之下,花了两周时间,用 C 语言写出了 Git 的第一个版本。

是的,你没看错——两周。这就是大神的速度。

为什么叫 Git?Linus 自己说这个词是英国俚语,意思是"饭桶"、"蠢货"。他自嘲说:"我总是用我自己的名字命名项目,Linux 就是这样,所以这次我叫它 Git。"(当然这是玩笑话,但也说明了大神的幽默感)


4. Git、GitHub、GitLab、Gitee,到底什么关系?

这是新手最容易搞混的问题。我们用一张表格来理清:

| 名称 | 是什么 | 类比 |

|------|--------|------|

| Git | 版本控制工具(软件) | 照相机 |

| GitHub | 代码托管平台(网站) | 照片分享网站(如 Instagram) |

| GitLab | 代码托管平台(网站) | 另一个照片分享网站(如 Flickr) |

| Gitee(码云) | 代码托管平台(网站,国内) | 国内的照片分享网站 |

重要结论:Git 是工具本身,GitHub/GitLab/Gitee 是使用 Git 的网站。


graph LR

    subgraph 你用Git管理代码

        Code[你的代码]

        Git[Git工具]

        Code --> Git

    end

   

    subgraph 你把代码托管到平台上

        Git --> GitHub

        Git --> GitLab

        Git --> Gitee

    end

   

    GitHub[GitHub<br/>全球最大]

    GitLab[GitLab<br/>企业常用]

    Gitee[Gitee码云<br/>国内速度快]

你可以把 Git 理解为"Word 软件",而 GitHub 是"百度文库"——Word 是编辑文档的工具,百度文库是分享文档的平台。你用 Word 写好文档,可以选择上传到百度文库,也可以上传到别的平台,或者不上传。

同理,你用 Git 管理代码,然后可以把代码推送到 GitHub、GitLab、Gitee 中的任意一个或多个。

在中国,你需要知道:

  • GitHub 全球最大,开源项目最多,但国内访问有时不稳定

  • Gitee(码云)是国内平台,访问速度快,中文界面友好

  • 很多国内公司使用自建的 GitLab 服务器(部署在公司内网)


5. Git 的安装

Windows 安装

  1. 去 Git 官网下载:git-scm.com/download/wi…

  2. 下载完是一个 .exe 安装包,双击运行

  3. 一路点"Next"就行(默认配置就够用了,不需要改任何选项)

  4. 安装完成后,在任意文件夹右键,如果看到 "Git Bash Here""Git GUI Here" 就说明安装成功了

提示:虽然 Windows 上有 Git GUI(图形界面),但我强烈建议你用 Git Bash(命令行)。因为:

  1. 命令行是所有教程的通用语言
  1. 服务器上只有命令行
  1. 面试时问的也是命令行
  1. 用熟了命令行,你会发现比图形界面快得多

安装后的第一步:配置你的身份

打开 Git Bash(在桌面或任意文件夹右键,选择"Git Bash Here"),输入以下命令:


# 设置你的用户名(会用在你每次提交中)

git config --global user.name "你的名字"

  


# 设置你的邮箱(会用在你每次提交中)

git config --global user.email "你的邮箱@example.com"

  


# 查看配置是否生效

git config --global --list

为什么要做这个配置?因为 Git 是多人协作的工具,每次提交代码都会记录"是谁提交的"。如果没有配置用户名和邮箱,Git 会拒绝提交。

面试小贴士git config 有三个级别:

  • --system:系统级,对所有用户生效(几乎不用)
  • --global:用户级,对当前用户的所有仓库生效(最常用)
  • --local:仓库级,只对当前仓库生效(不写参数就是 local)

优先级:local > global > system


6. 第一个 Git 仓库:git init

现在我们来创建人生中第一个 Git 仓库。

什么是仓库(Repository)?

仓库,英文叫 Repository(简称 Repo),就是被 Git 管理的一个文件夹。这个文件夹里的所有文件的修改、删除、新增,都会被 Git 跟踪记录。

创建仓库


# 1. 创建一个文件夹
mkdir my-first-project

# 2. 进入这个文件夹
cd my-first-project

# 3. 初始化 Git 仓库
git init

执行 git init 后,你会看到输出:

Initialized empty Git repository in /Users/xxx/my-first-project/.git/

这行输出告诉你:Git 在这个文件夹里创建了一个隐藏的 .git 文件夹。这个 .git 文件夹就是 Git 仓库的核心——所有版本历史、配置信息,都保存在这里。

重要提示:如果你删除了 .git 文件夹,这个文件夹就不再是一个 Git 仓库了,所有版本历史都会丢失。但这个文件夹本身的内容(你的代码文件)不会丢。

git clone:克隆别人的仓库

除了自己创建新仓库,更多时候你需要"克隆"别人的仓库到本地:

# 克隆一个仓库到本地
git clone https://github.com/xxx/xxx.git

# 克隆到指定文件夹名
git clone https://github.com/xxx/xxx.git my-folder-name

git clone 做的事情是:

  1. 把远程仓库的所有文件下载到本地

  2. 把远程仓库的所有历史记录也下载到本地

  3. 自动关联远程仓库


graph LR

    Remote[远程仓库-GitHub] -->|git clone| Local[本地仓库<br/>所有文件+所有历史]

    Local -->|git push| Remote

    Remote -->|git pull| Local


7. Git 的三个区域(核心概念,必须理解)

这是 Git 最核心的概念,也是理解后续所有内容的基础。很多人学了 Git 用不好,就是因为没有真正理解这三个区域。

Git 把文件分成三个"区域":


graph LR

    WD[工作区<br/>Working Directory<br/>你正在编辑的文件]

    -->|git add| SA[暂存区<br/>Staging Area<br/>准备提交的文件]

    -->|git commit| LR[本地仓库<br/>Local Repository<br/>已提交的历史记录]

工作区(Working Directory)

就是你正在操作的文件夹。你在里面写代码、改文件、删文件,所有这些操作都发生在工作区。

简单理解:工作区 = 你在资源管理器里看到的文件夹。

暂存区(Staging Area / Index)

暂存区是一个中间区域。你修改完文件后,不直接提交到仓库,而是先"添加"到暂存区,确认无误后再"提交"到仓库。

为什么要有暂存区?想象你要提交代码,但你改了10个文件,其中8个是功能代码,2个是调试用的临时打印。你不想把调试代码也提交上去。暂存区就让你可以选择性地提交——你可以只把8个文件添加到暂存区,提交时就只提交这8个。

本地仓库(Local Repository / Git Repository)

当你执行 git commit 后,暂存区里的文件就会被永久保存到本地仓库中。每次 commit 都是一个"快照"——记录了此刻所有文件的状态。

用生活化的例子来理解三个区域:

如果把 Git 比作淘宝购物:

  • 工作区 = 你在淘宝上逛,把东西加入购物车之前的状态(浏览商品)
  • 暂存区 = 购物车(已经选好了,但还没付款)
  • 本地仓库 = 已下单付款(订单已经生成,不可轻易更改)

如果把 Git 比作拍照:

  • 工作区 = 你在摆姿势、调试灯光、取景
  • 暂存区 = 已经取好景,半按快门对焦
  • 本地仓库 = 咔嚓!照片已经拍摄完成,存入相册

8. 文件的四种状态

文件在 Git 中有四种状态,理解状态是理解 Git 工作流程的关键:


stateDiagram-v2

    [*] --> Untracked: 新创建文件

    Untracked --> Staged: git add

    Unmodified --> Modified: 编辑文件

    Modified --> Staged: git add

    Staged --> Unmodified: git commit

    Unmodified --> Untracked: git rm --cached

1. Untracked(未跟踪)

新创建的文件,Git 还不知道它的存在。就像你搬了新家,门卫还不知道你是住户。

在终端中,这种文件会显示为 红色 的文件名。

2. Unmodified(未修改)

文件已经被 Git 跟踪,并且自从上次提交后没有改动过。一切风平浪静。

这种文件在 git status 中不会显示(因为一切正常,没有需要关注的变化)。

3. Modified(已修改)

文件已经被 Git 跟踪,但自从上次提交后被你修改过了。Git 检测到了变化。

在终端中,这种文件也会显示为 红色 的文件名(和 Untracked 区分需要看具体提示文字)。

4. Staged(已暂存)

文件已经在暂存区中,等待被提交(commit)。

在终端中,这种文件会显示为 绿色 的文件名。

完整状态流转表

| 当前状态 | 触发操作 | 新状态 | 命令 |

|----------|----------|--------|------|

| 不存在 | 新建文件 | Untracked | 手动创建 |

| Untracked | 添加到暂存区 | Staged | git add <file> |

| Unmodified | 修改文件内容 | Modified | 手动编辑 |

| Modified | 添加到暂存区 | Staged | git add <file> |

| Staged | 提交到仓库 | Unmodified | git commit -m "xxx" |

| Unmodified | 从跟踪中移除 | Untracked | git rm --cached <file> |


9. 动手实验:感受三个区域

光看文字是不够的,我们来一步一步操作,亲手感受 Git 的三个区域。

步骤一:初始化仓库并创建文件


# 创建实验文件夹
mkdir git-lab
cd git-lab

# 初始化 Git 仓库
git init

# 创建一个文件
echo "这是第一行内容" > hello.txt

步骤二:查看状态(git status)

git status

你会看到:

On branch master

No commits yet

Untracked files:

  (use "git add <file>..." to include in what will be committed)

        hello.txt

nothing added to commit but untracked files present (use "git add" to track)

关键信息:

  • Untracked files:Git 发现了 hello.txt,但目前还没有跟踪它

  • Git 甚至贴心地告诉你了:用 git add 来跟踪这个文件

步骤三:将文件添加到暂存区

git add hello.txt

git status

现在你会看到:

On branch master

No commits yet

Changes to be committed:

  (use "git rm --cached <file>..." to unstage)

        new file:   hello.txt

关键变化:

  • 文件名从红色变成了绿色(终端中)

  • 状态从 "Untracked files" 变成了 "Changes to be committed"(准备提交的变更)

  • Git 又贴心地告诉你了:如果想取消暂存,用 git rm --cached

步骤四:提交到仓库

git commit -m "第一次提交:创建 hello.txt"

输出:

[master (root-commit) abc1234] 第一次提交:创建 hello.txt

 1 file changed, 1 insertion(+)

 create mode 100644 hello.txt

现在再查看状态:

git status
On branch master

nothing to commit, working tree clean

"working tree clean"——工作区干净了!这意味着:

  • 工作区里的文件已经和仓库里记录的一致

  • 没有修改需要提交

步骤五:修改文件,重新观察

echo "这是第二行内容" >> hello.txt

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:   hello.txt

  


no changes added to commit (use "git add" and/or "git commit -a")

现在 hello.txt 的状态是 Modified(已修改但未暂存)。Git 清楚地告诉你:

  • 这个文件被修改了

  • git add 把它加入暂存区

  • 或者用 git restore 放弃修改

步骤六:加入暂存区并提交

git add hello.txt

git commit -m "第二次提交:添加第二行内容"

git status

又是 "working tree clean"了。


10. 查看提交历史(git log)

到现在为止,我们已经做了两次提交。让我们看看这些历史记录:

git log

输出(每台电脑的哈希值不同):

commit a1b2c3d4e5f6... (HEAD -> master)

Author: 你的名字 <你的邮箱@example.com>

Date:   Sat May 29 22:00:00 2026 +0800

  


    第二次提交:添加第二行内容

  


commit 1234abcd5678...

Author: 你的名字 <你的邮箱@example.com>

Date:   Sat May 29 21:55:00 2026 +0800

  


    第一次提交:创建 hello.txt

每个 commit 都记录了:

  • commit 哈希值:一串40位的十六进制字符,是这次提交的唯一标识(相当于身份证号)

  • Author:提交者(就是我们之前用 git config 配置的名字和邮箱)

  • Date:提交时间

  • 提交信息:我们写的 commit message

git log 的常用参数

# 简洁模式,每个提交只显示一行
git log --oneline

# 显示分支图形
git log --oneline --graph --all

# 只显示最近 5 条记录
git log -5
  
# 显示每次提交修改了哪些文件
git log --stat

# 显示每次提交的具体改动内容
git log -p

11. Git 的核心优势总结

学到这里,我们来总结一下 Git 相比传统方式到底好在哪里:

1. 完整的版本历史

每一行代码是谁写的、什么时候写的、为什么这么写,都有记录。

2. 强大的回退能力

出错了?随时可以回到之前的任何一个版本。就像打游戏有存档一样安心。

3. 分支功能

可以同时开发多个功能,互不干扰。比如你在开发新功能,突然线上出了 bug,可以快速开一个新分支修 bug,修完再回来继续开发(分支会在第三篇详细讲)。

4. 离线工作

不需要联网就能提交代码、查看历史、切换版本。因为完整的仓库在你自己的电脑上。

5. 高效协作

多人同时修改同一个项目,Git 能自动合并大部分修改,真正冲突的地方明确标记出来让你手动处理。