版本控制 Git 入门:仓库、提交与分支
Git 入门:从仓库、提交到分支的完整指南
版本控制是现代软件开发的基础技能,无论你是个人项目还是团队协作,掌握 Git 都能让你高效管理代码历史、避免灾难性覆盖,并自信地尝试新想法。本教程面向零基础初学者,从核心概念出发,手把手带你完成仓库创建、首次提交、分支切换与合并,让你在 30 分钟内从零开始使用 Git。
什么是版本控制?为什么选择 Git?
版本控制系统(VCS)用于记录文件随时间的变化,方便你回到之前的某个状态、对比不同版本,或多人同时修改同一套文件而不冲突。
Git 是目前最流行的分布式版本控制系统。与集中式不同,每个开发者的电脑上都有一个完整的仓库副本,这意味着:
- 离线也能提交、查看历史。
- 没有单点故障,服务器宕机不影响本地工作。
- 分支与合并操作极快,因为都在本地完成。
本教程将聚焦三个基础对象:仓库(Repository)、提交(Commit) 和 分支(Branch)。理解它们的关系,你就掌握了 Git 的核心模型。
仓库(Repository):项目的 Git 核心
仓库是 Git 用来保存项目所有版本信息的地方。当你对一个文件夹执行 git init 时,Git 会在其中创建一个隐藏目录 .git,这就是仓库的全部内容。
创建你的第一个仓库
-
初始化新仓库
在你的项目目录下打开终端(或 Git Bash),执行:git init终端会提示
Initialized empty Git repository in ...,说明一个空白的 Git 仓库已创建。 -
克隆已有仓库
如果想获取远程已有的项目,使用:git clone <仓库地址>这样会把远程仓库完整下载到本地,自动配置好追踪关系。
仓库的三个区域
理解仓库内部的数据流转有助于掌握提交的本质。Git 将文件划分为三个区域:
| 区域 | 作用 | 对应命令 |
|---|---|---|
| 工作目录(Working Directory) | 你实际编辑的文件夹,改动的文件首先出现在这里 | — |
| 暂存区(Staging Area / Index) | 下一次提交的“候选清单”,你选择哪些改动要放入提交 | git add |
| 版本库(Repository) | 正式保存历史记录的地方,提交后数据永久存储在此 | git commit |
文件的状态在它们之间转换:未跟踪(Untracked)→ 已暂存(Staged)→ 已提交(Committed)。
提交(Commit):保存项目快照
提交是仓库中的一个快照节点,记录了在某个时间点所有被跟踪文件的准确状态。每次提交都包含:
- 唯一的 40 位 SHA-1 哈希值(如
a1b2c3d...),用作标识。 - 作者、时间戳。
- 提交消息(描述改了什么)。
- 指向父提交的指针(形成历史链)。
进行你的第一次提交
-
创建或修改文件
在工作目录下添加一个README.md,随便写点内容。 -
查看状态
git status你会看到
README.md在“Untracked files”下面。 -
添加到暂存区
git add README.md或使用
git add .添加当前目录下所有改动。再次运行git status,文件变为“to be committed”。 -
执行提交
git commit -m "初始提交:添加README"-m后跟提交消息,务必清晰说明本次改动的目的。现在运行git log,你会看到刚刚的提交记录。
优秀提交习惯
- 原子化提交:一次提交只做一件事(修复 bug、添加特性分别提交)。
- 清晰的提交消息:采用“类型+简述”的格式,如
feat: 添加用户登录功能、fix: 修复首页加载慢的问题。 - 勤提交:完成一个小功能点或修改后立即提交,避免积累太多改动。
分支(Branch):并行开发的利器
分支是一条独立于主线的提交链指针。默认情况下,Git 创建名为 master(或 main)的分支。分支允许你在不影响主线的情况下进行实验、开发新功能或修复 bug,完成后再合并回去。
为何需要分支?
设想你正在开发一个网站,突然需要紧急修复线上 bug。如果没有分支,你不得不把写到一半的新功能代码先注释掉或手动保存,风险极高。有了分支,你可以:
- 从稳定的主分支切出一个
hotfix分支,修复后合并上线。 - 回到之前的功能分支继续工作,完全隔离。
分支基本操作
# 创建新分支(但不切换)
git branch feature-login
# 切换至新分支
git checkout feature-login
# 更简捷的创建并切换
git checkout -b feature-signup
现在你在 feature-signup 分支上的任何改动、提交都不会影响 main 分支。
合并分支
当新功能开发完成,你需要把它合并回主线:
-
切回主分支:
git checkout main -
执行合并:
git merge feature-signup
如果两个分支修改了不同文件,或相同文件的不同行,Git 会自动合并。如果修改了同一行,就会产生合并冲突,需要手动解决。
查看分支
# 列出所有本地分支,当前分支前有*
git branch
# 查看所有分支(包括远程跟踪分支)
git branch -a
分支与提交的关系
分支本质上是一个指向提交的移动指针。当你新建提交时,当前分支指针自动向前移动。合并操作则创建一种“合并提交”,将两条历史线统一。
Git 对象模型简图
提交对象(commit) --指向--> 树对象(tree) --指向--> 文件快照(blob)
⁚ ⁚
分支(指针) 指向 某个提交
HEAD 指向 当前分支
这是 Git 内部轻量且快速的原因——操作分支仅需改变指针。
实战演练:一个完整的工作流
假设你要开发一个“登录页面”功能。
-
从主干分支创建一个
feature-login分支:git checkout -b feature-login -
编辑
login.html,添加代码,然后提交:git add login.html git commit -m "feat: 添加登录页面结构" -
继续修改样式文件
style.css,再次提交:git add style.css git commit -m "style: 完善登录页面样式" -
此时若需紧急修复,切回
main,拉取最新代码,创建hotfix-typo分支修复,提交后合并回main,然后删除hotfix-typo。 -
回到
feature-login继续开发,或者执行:git checkout main git merge feature-login将功能合并。
-
合并后,可以安全删除功能分支(不再需要时):
git branch -d feature-login
常见问题与进阶指引
Q:git pull 和 git fetch 有什么区别?
A:fetch 只下载远程仓库的更新,不合并;pull = fetch + merge,可能会产生冲突。建议新手先用 fetch 查看变化,再手动合并。
Q:如何撤销提交?
A:如果提交还未推送到远程,可以使用 git reset(如 git reset HEAD~1 --soft 保留改动)或 git revert 生成一次反向提交。
Q:如何查看提交历史图?
A:终端中使用 git log --oneline --graph --all,会看到分支的合并路线。
总结
- 仓库是项目的 Git 核心,包含所有历史。
- 提交是文件快照的集合,形成项目演进历史。
- 分支是并行工作的独立线,让你隔离风险、高效协作。
掌握这三个核心概念后,你可以利用 Git 管理几乎任何类型的项目。下一步建议在自己的练习项目中重复这些操作,并探索 .gitignore 文件、远程仓库(GitHub/GitLab)的使用,持续精进你的版本控制能力。