版本控制 Git 入门:仓库、提交与分支

FreeGuideOnline 最新 2026-06-13

Git 入门:从仓库、提交到分支的完整指南

版本控制是现代软件开发的基础技能,无论你是个人项目还是团队协作,掌握 Git 都能让你高效管理代码历史、避免灾难性覆盖,并自信地尝试新想法。本教程面向零基础初学者,从核心概念出发,手把手带你完成仓库创建、首次提交、分支切换与合并,让你在 30 分钟内从零开始使用 Git。

什么是版本控制?为什么选择 Git?

版本控制系统(VCS)用于记录文件随时间的变化,方便你回到之前的某个状态、对比不同版本,或多人同时修改同一套文件而不冲突。

Git 是目前最流行的分布式版本控制系统。与集中式不同,每个开发者的电脑上都有一个完整的仓库副本,这意味着:

  • 离线也能提交、查看历史。
  • 没有单点故障,服务器宕机不影响本地工作。
  • 分支与合并操作极快,因为都在本地完成。

本教程将聚焦三个基础对象:仓库(Repository)提交(Commit)分支(Branch)。理解它们的关系,你就掌握了 Git 的核心模型。

仓库(Repository):项目的 Git 核心

仓库是 Git 用来保存项目所有版本信息的地方。当你对一个文件夹执行 git init 时,Git 会在其中创建一个隐藏目录 .git,这就是仓库的全部内容。

创建你的第一个仓库

  1. 初始化新仓库
    在你的项目目录下打开终端(或 Git Bash),执行:

    git init
    

    终端会提示 Initialized empty Git repository in ...,说明一个空白的 Git 仓库已创建。

  2. 克隆已有仓库
    如果想获取远程已有的项目,使用:

    git clone <仓库地址>
    

    这样会把远程仓库完整下载到本地,自动配置好追踪关系。

仓库的三个区域

理解仓库内部的数据流转有助于掌握提交的本质。Git 将文件划分为三个区域:

区域 作用 对应命令
工作目录(Working Directory) 你实际编辑的文件夹,改动的文件首先出现在这里
暂存区(Staging Area / Index) 下一次提交的“候选清单”,你选择哪些改动要放入提交 git add
版本库(Repository) 正式保存历史记录的地方,提交后数据永久存储在此 git commit

文件的状态在它们之间转换:未跟踪(Untracked)→ 已暂存(Staged)→ 已提交(Committed)

提交(Commit):保存项目快照

提交是仓库中的一个快照节点,记录了在某个时间点所有被跟踪文件的准确状态。每次提交都包含:

  • 唯一的 40 位 SHA-1 哈希值(如 a1b2c3d...),用作标识。
  • 作者、时间戳。
  • 提交消息(描述改了什么)。
  • 指向父提交的指针(形成历史链)。

进行你的第一次提交

  1. 创建或修改文件
    在工作目录下添加一个 README.md,随便写点内容。

  2. 查看状态

    git status
    

    你会看到 README.md 在“Untracked files”下面。

  3. 添加到暂存区

    git add README.md
    

    或使用 git add . 添加当前目录下所有改动。再次运行 git status,文件变为“to be committed”。

  4. 执行提交

    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 分支。

合并分支

当新功能开发完成,你需要把它合并回主线:

  1. 切回主分支:

    git checkout main
    
  2. 执行合并:

    git merge feature-signup
    

如果两个分支修改了不同文件,或相同文件的不同行,Git 会自动合并。如果修改了同一行,就会产生合并冲突,需要手动解决。

查看分支

# 列出所有本地分支,当前分支前有*
git branch

# 查看所有分支(包括远程跟踪分支)
git branch -a

分支与提交的关系

分支本质上是一个指向提交的移动指针。当你新建提交时,当前分支指针自动向前移动。合并操作则创建一种“合并提交”,将两条历史线统一。

Git 对象模型简图

提交对象(commit) --指向--> 树对象(tree) --指向--> 文件快照(blob)
⁚                 ⁚
分支(指针) 指向 某个提交
HEAD 指向 当前分支

这是 Git 内部轻量且快速的原因——操作分支仅需改变指针。

实战演练:一个完整的工作流

假设你要开发一个“登录页面”功能。

  1. 从主干分支创建一个 feature-login 分支:

    git checkout -b feature-login
    
  2. 编辑 login.html,添加代码,然后提交:

    git add login.html
    git commit -m "feat: 添加登录页面结构"
    
  3. 继续修改样式文件 style.css,再次提交:

    git add style.css
    git commit -m "style: 完善登录页面样式"
    
  4. 此时若需紧急修复,切回 main,拉取最新代码,创建 hotfix-typo 分支修复,提交后合并回 main,然后删除 hotfix-typo

  5. 回到 feature-login 继续开发,或者执行:

    git checkout main
    git merge feature-login
    

    将功能合并。

  6. 合并后,可以安全删除功能分支(不再需要时):

    git branch -d feature-login
    

常见问题与进阶指引

Q:git pullgit 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)的使用,持续精进你的版本控制能力。