跳到主要内容

Git 基础概念

学习目标

  • 理解为什么需要版本管理(通过真实的痛点场景)
  • 掌握 Git 的四个核心概念:仓库、暂存区、提交、分支
  • 完成 Git 的安装和初始配置

没有 Git 的世界

在学 Git 之前,先看看没有 Git 的时候,开发者是怎么管理代码的:

痛点一:文件命名地狱

你写了一个 AI 模型训练脚本,不断修改、不断保存:

train.py
train_v2.py
train_v2_final.py
train_v2_final_真的最终版.py
train_v2_final_真的最终版_改了bug.py
train_v2_final_真的最终版_改了bug_老板说再改改.py

一周后你想回到"第一次改 bug 之前"的版本——到底是哪个文件?

痛点二:改坏了回不去

你兴冲冲地重构了 model.py,改了 200 行代码。运行——报错了。再改——更多错误。你想恢复到改之前的样子,但你已经 Ctrl+S 保存了无数次,回不去了。

痛点三:多人协作是灾难

你和同事同时在改同一个文件。你改了前半部分,他改了后半部分。你们各自保存,然后用微信互传文件。谁来合并?怎么合并?万一覆盖了对方的修改怎么办?

Git 解决的就是这三个问题:

痛点Git 怎么解决
文件命名地狱每次修改自动记录版本,不需要手动重命名
改坏了回不去任何时候都可以回退到之前的任意版本
多人协作困难每个人在自己的分支上工作,最后自动合并

Git 是什么?

一句话:Git 是一个代码版本管理工具。 它帮你记录代码的每一次修改,让你可以随时查看历史、回退版本、与他人协作。

几个关键点:

  • Git 是免费开源
  • Git 是本地工具——不联网也能用(GitHub 是 Git 的在线托管服务,不是 Git 本身)
  • Git 是行业标准——几乎所有软件公司、所有开源项目都用 Git
  • Git 由 Linux 之父 Linus Torvalds 在 2005 年创造

Git 的四个核心概念

把 Git 想象成一个智能存档系统。你在玩一个大型游戏(写代码),Git 帮你随时存档、读档。

概念一:仓库(Repository)

仓库 = 一个被 Git 管理的项目文件夹。

普通文件夹和 Git 仓库的区别,就像普通笔记本和一个带有"所有修改记录"的魔法笔记本。

# 把一个普通文件夹变成 Git 仓库
cd my-project
git init

执行 git init 之后,文件夹里会多出一个隐藏的 .git 目录,这就是 Git 存放所有版本记录的地方。你不需要打开它,知道它在就行。

概念二:暂存区(Staging Area)

这是 Git 最独特的设计。暂存区是一个"准备提交"的中间地带。

用搬家来类比:

  1. 你房间里有很多东西(工作目录 —— 你正在修改的文件)
  2. 你选了一些要搬走的东西放到门口(暂存区 —— 你选好的、准备记录的文件)
  3. 搬家公司来了,把门口的东西装车运走(提交 —— 正式记录这次修改)
# 你修改了 3 个文件:model.py、train.py、notes.txt

# 只把 model.py 和 train.py 放到"门口"(暂存区)
git add model.py train.py

# notes.txt 还留在"房间里",这次不提交它

为什么需要暂存区?因为你可能同时改了 5 个文件,但这次只想记录其中 2 个文件的修改。暂存区让你能精确控制每次提交包含哪些变更

概念三:提交(Commit)

提交 = 一次正式的版本记录。 就像游戏里的存档点。

每次提交包含:

  • 哪些文件被修改了
  • 具体改了什么(哪一行加了什么、删了什么)
  • 什么时候提交的
  • 谁提交的
  • 一段描述信息(说明这次改了什么)
git commit -m "修复了模型训练时学习率过大的 bug"

-m 后面的引号里是提交信息,用来说明这次修改做了什么。好的提交信息应该让别人(包括未来的你)一看就知道这次改了什么。

一个项目的提交历史看起来像这样:

提交 #5: "添加数据增强功能"               ← 最新
提交 #4: "修复了模型训练时学习率过大的 bug"
提交 #3: "添加了 CNN 模型定义"
提交 #2: "完成数据加载模块"
提交 #1: "项目初始化,添加 README" ← 最早

你可以随时回到任何一个提交点,就像游戏读档一样。

概念四:分支(Branch)

分支 = 独立的开发线路。 就像平行宇宙。

想象你的项目是一条主路(main 分支)。你想试一个新功能(比如换一个模型架构),但不确定能不能成功。你不想在主路上动刀——万一改坏了呢?

这时你可以从主路上"岔出"一条新路(新分支),在新路上随便改。如果成功了,把新路合并回主路;如果失败了,直接删掉新路,主路完全不受影响。

main分支:      ● ─── ● ─── ● ─── ● ─── ●  (稳定的代码)
\ ↗
feature分支: ● ─── ● (尝试新功能)

分支在后面的章节会详细讲,现在只需要知道它的存在。


完整工作流程(先看全貌)

用 Git 管理代码的完整流程是这样的:

你修改了文件  →  选择要记录的文件(add)  →  正式记录(commit)  →  推送到云端(push)
工作目录 暂存区 本地仓库 远程仓库(GitHub)

用一个具体的例子:

# 1. 你写了一个新的模型文件
# (这时候文件在"工作目录",Git 知道你改了东西,但还没记录)

# 2. 把它放入暂存区
git add model.py

# 3. 正式提交(记录这次修改)
git commit -m "添加 ResNet 模型定义"

# 4. 推送到 GitHub(让云端也有这份记录)
git push

安装 Git

macOS

# 方法1:用 Homebrew(推荐)
brew install git

# 方法2:直接在终端输入 git,macOS 会提示你安装 Xcode Command Line Tools
git --version

Ubuntu / Debian

sudo apt update
sudo apt install git

Windows

# 用 winget
winget install Git.Git

# 安装后重启终端,然后验证
git --version

也可以从 git-scm.com 下载安装包。安装时一路默认即可。

验证安装

git --version
# 输出类似: git version 2.43.0

看到版本号就说明安装成功了。


初始配置

安装完 Git 后,需要告诉它你是谁。这些信息会出现在每次提交的记录里。

# 设置你的名字(用英文,这会显示在 GitHub 上)
git config --global user.name "Zhang San"

# 设置你的邮箱(建议用 GitHub 注册的同一个邮箱)
git config --global user.email "[email protected]"

# 设置默认分支名为 main(新版 Git 的标准)
git config --global init.defaultBranch main

# 查看配置,确认设置成功
git config --list
关于 --global

--global 表示这是全局配置,对你电脑上所有 Git 仓库生效。如果某个项目需要不同的配置(比如公司项目用公司邮箱),可以在那个项目里不加 --global 单独设置。


小试一下

现在我们来创建你的第一个 Git 仓库,感受一下完整流程:

# 创建一个新项目
mkdir my-first-repo
cd my-first-repo

# 初始化 Git 仓库
git init
# 输出: Initialized empty Git repository in .../my-first-repo/.git/

# 创建一个文件
echo "# 我的第一个 Git 仓库" > README.md
echo "print('Hello Git!')" > hello.py

# 查看状态——Git 会告诉你哪些文件有变化
git status
# 会看到 README.md 和 hello.py 显示为红色(未跟踪的文件)

# 把文件添加到暂存区
git add .
# "." 表示当前目录下所有文件

# 再看状态——文件变成了绿色(已暂存,准备提交)
git status

# 提交!
git commit -m "项目初始化:添加 README 和 hello.py"
# 输出: [main (root-commit) abc1234] 项目初始化:添加 README 和 hello.py

# 查看提交历史
git log --oneline
# 输出: abc1234 项目初始化:添加 README 和 hello.py

恭喜你,你的第一次 Git 提交完成了!

现在试着修改一下文件,再提交一次:

# 修改 hello.py
echo "print('Hello Git! I am learning AI.')" > hello.py

# 查看改了什么
git diff
# 会用红色/绿色高亮显示你的修改

# 添加并提交
git add hello.py
git commit -m "更新问候语"

# 查看历史——现在有两条记录了
git log --oneline
# 输出:
# def5678 更新问候语
# abc1234 项目初始化:添加 README 和 hello.py

两次提交,两个存档点。随时可以回到任何一个。


小结

概念一句话解释类比
仓库被 Git 管理的项目文件夹一个有"撤销历史"的魔法笔记本
暂存区准备提交的中间地带搬家时放在门口待装车的东西
提交一次正式的版本记录游戏存档
分支独立的开发线路平行宇宙
工作目录你正在编辑的文件你正在写的草稿
核心理解

Git 的工作流程就三步:改文件 → add(暂存)→ commit(提交)。后面所有 Git 操作都是在这个基础上展开的。