Skip to content

Git 深度学习指南

从入门到精通的 Git 完全手册

Git 是现代软件开发中最重要的版本控制工具。本文档将带你从核心概念出发,逐步掌握日常操作、团队协作,直至高级技巧和底层原理。


核心概念 (Core Concepts)

三大区域:Git 的数据流

理解 Git 的三大工作区域是掌握所有操作的基础。

区域英文名说明类比
工作区Working Directory你在编辑器里看到和修改的文件你的书桌
暂存区Staging Area / Index准备下次提交的文件快照购物车 / 候车室
本地仓库Local Repository永久存储的版本历史照片相册

TIP

暂存区的妙用:暂存区允许你精确控制哪些修改进入下一次提交。你可以修改了 10 个文件,但只提交其中 3 个相关的修改。

文件状态:生命周期

一个文件在 Git 中会经历以下状态:

状态含义查看方式
Untracked (未追踪)Git 不知道这个文件的存在红色,标记为 ??
Modified (已修改)文件被修改但未暂存红色,标记为 M
Staged (已暂存)修改已加入暂存区,等待提交绿色,标记为 AM
Committed (已提交)安全存储在本地仓库中不显示 (干净状态)

基础指令 (The Basics)

仓库初始化

bash
# 在当前目录创建新的 Git 仓库
git init

# 克隆远程仓库到本地
git clone <url>
git clone git@github.com:user/repo.git

查看状态 - 你的雷达

bash
# 查看工作区和暂存区的状态
git status

# 简洁模式
git status -s
# 输出示例:
# M  file.txt     -> 已暂存的修改
#  M file2.txt    -> 未暂存的修改
# ?? newfile.txt  -> 未追踪的文件

NOTE

养成习惯:在执行任何 Git 操作前,先 git status 了解当前状态。

暂存修改

bash
# 添加单个文件到暂存区
git add <file>

# 添加所有修改过的文件
git add .

# 交互式添加(可以选择部分修改)
git add -p

提交存档 - 按下快门

bash
# 提交并附带消息
git commit -m "描述这次修改做了什么"

# 添加并提交(跳过 git add,仅对已追踪文件有效)
git commit -am "快速提交"

# 修改上一次提交的消息
git commit --amend -m "新的提交消息"

IMPORTANT

提交信息规范:好的提交信息应该简洁明了地描述"做了什么"和"为什么"。

  • 正确: feat: 添加用户登录功能
  • 正确: fix: 修复购物车数量计算错误
  • 错误: update / fix bug / 修改

查看历史记录

bash
# 查看提交历史
git log

# 简洁单行显示
git log --oneline

# 图形化显示分支合并历史
git log --oneline --graph --all

# 查看某个文件的修改历史
git log -p <file>

平行宇宙 (Branches)

分支是 Git 最强大的特性之一。它允许你在不影响主线的情况下进行实验性开发。

分支基本操作

bash
# 查看所有分支
git branch         # 本地分支
git branch -a      # 包含远程分支

# 创建新分支
git branch <name>

# 切换分支
git switch <name>
git checkout <name>  # 旧语法

# 创建并切换到新分支
git switch -c <name>
git checkout -b <name>  # 旧语法

# 删除分支
git branch -d <name>    # 安全删除(已合并)
git branch -D <name>    # 强制删除

合并分支 (Merge)

bash
# 将 feature 分支合并到当前分支
git merge feature

Git 会根据情况选择合并策略:

Fast-forward (快进):如果目标分支没有新提交,Git 直接把指针向前移动。

Three-way (三方合并):如果两个分支都有新提交,Git 会创建一个新的合并提交。

解决冲突 (Conflict)

当两个分支修改了同一文件的同一区域时,Git 无法自动合并,会产生冲突。

冲突标记示例:

<<<<<<< HEAD
你在当前分支的修改
=======
对方分支的修改
>>>>>>> feature

解决步骤

  1. 打开有冲突的文件
  2. 手动编辑,保留需要的内容,删除冲突标记
  3. git add <file> 标记已解决
  4. git commit 完成合并

WARNING

解决冲突时要仔细检查,确保两边的逻辑都正确保留或合理取舍。


后悔药与时光机 (Undo & Fix)

Git 提供了多种撤销操作的方法,但它们的作用范围和安全性各不相同。

撤销工作区和暂存区的修改

bash
# 撤销暂存(从暂存区移回工作区,保留修改)
git restore --staged <file>

# 丢弃工作区的修改(危险!无法恢复)
git restore <file>

历史修正

命令作用适用场景安全性
git reset移动 HEAD 指针,重写历史本地未推送的代码会改变历史
git revert创建新提交来撤销旧提交已推送的公共代码安全
bash
# Reset 三种模式
git reset --soft HEAD~1   # 保留修改在暂存区
git reset --mixed HEAD~1  # 保留修改在工作区(默认)
git reset --hard HEAD~1   # 彻底丢弃修改(危险)

# Revert 安全撤销
git revert <commit-hash>  # 创建一个反向提交

临时救火 - Stash

当你正在开发一个功能,突然需要切换分支去修复 bug:

bash
# 藏匿当前修改
git stash
git stash save "正在开发用户模块"

# 查看 stash 列表
git stash list

# 恢复并删除最近的 stash
git stash pop

# 恢复但保留 stash
git stash apply

# 删除指定 stash
git stash drop stash@{0}

远程协作 (Remote)

同步指令

bash
# 克隆远程仓库
git clone <url>

# 查看远程仓库
git remote -v

# 添加远程仓库
git remote add origin <url>

# 获取远程更新(只下载,不合并)
git fetch

# 拉取远程更新(下载 + 合并)
git pull                    # 等价于 fetch + merge
git pull --rebase           # 等价于 fetch + rebase

# 推送到远程
git push
git push -u origin main     # 首次推送并设置上游
git push --force            # 强制推送(覆盖远程,危险)

协作工作流

标准的开源协作流程:

TIP

在提交 PR 之前,先 git fetch upstreamgit rebase upstream/main,保持你的分支与上游同步。


高级进阶 (Advanced)

变基 (Rebase)

Rebase 可以让提交历史变成一条直线,更加清晰。

bash
# 将当前分支变基到 main
git rebase main

# 交互式变基(可以编辑、合并、删除提交)
git rebase -i HEAD~3

交互式变基操作

命令作用
pick保留这个提交
reword修改提交消息
squash合并到上一个提交
drop删除这个提交

CAUTION

黄金法则:永远不要对已经推送到公共仓库的提交进行 rebase!这会改变提交历史,导致其他人的代码出问题。

Merge vs Rebase

强制推送

bash
# 强制推送(覆盖远程历史)
git push --force

# 更安全的强制推送(如果远程有新提交则拒绝)
git push --force-with-lease

底层原理 (Internals)

理解 Git 的内部工作原理,能帮助你更好地使用它。

内容寻址存储

Git 使用 SHA-1 哈希 来标识所有对象。每个文件、目录结构、提交都有一个唯一的 40 位十六进制哈希值。

bash
# 查看对象内容
git cat-file -p <hash>

# 查看对象类型
git cat-file -t <hash>

三大核心对象

对象类型存储内容说明
Blob文件内容不包含文件名,纯内容
Tree目录结构包含文件名和指向 Blob/Tree 的指针
Commit提交元数据作者、时间、消息、指向 Tree 和父 Commit

NOTE

这种设计使得 Git 非常高效:相同内容只存储一次,无论它出现在多少个文件或版本中。

.git 目录结构

.git/
├── HEAD          # 当前所在分支的指针
├── config        # 仓库配置
├── objects/      # 所有对象(blob, tree, commit)
├── refs/         # 分支和标签的引用
│   ├── heads/    # 本地分支
│   └── remotes/  # 远程分支
└── index         # 暂存区

延伸阅读


下一步:查看 Git 命令速查表 快速查找常用命令!