Git 原理:一句话 + 三个核心概念
Git 是一个基于“快照”和“链式哈希”的分布式版本控制系统。
它不记录文件的“差异”,而是每次保存项目的一个完整快照,并通过加密哈希(SHA-1)将这些快照链接成一条历史链条。
一、核心思想:快照(Snapshot),不是差异(Diff)
大多数版本控制系统(如 SVN)记录的是文件的修改差异(即“从 A 到 B 改了哪几行”)。
而 Git 记录的是每一个时间点上项目的完整快照。
- 每次你执行
git commit,Git 就会把当前项目的状态“拍一张照片”存下来。 - 如果文件没变,Git 不会重复存储,而是只保存一个指向已有文件的指针,节省空间。
✅ 优点:速度快、完整性高、易于恢复任意版本。
二、数据存储:一切基于 SHA-1 哈希
Git 内部使用 SHA-1 哈希算法为每个数据块生成唯一的 40 位字符串 ID(如 a1b2c3d...)。
Git 存储的三种基本对象:
| 类型 | 作用 | 示例 |
|---|---|---|
| Blob(二进制大对象) | 存储文件内容(不包括文件名) | 一个 .txt 文件的内容 |
| Tree | 存储目录结构,指向 Blob 或其他 Tree | 类似文件夹,记录文件名和权限 |
| Commit | 代表一次提交,包含:作者、时间、日志、指向一个 Tree、指向前一个 Commit | 构成历史链条的节点 |
提交历史就像一条“链子”:
[Commit 3] → 指向 Tree C → 包含 Blob X, Y, Z
↑ (parent)
[Commit 2] → 指向 Tree B → 包含 Blob X, Y
↑
[Commit 1] → 指向 Tree A → 包含 Blob X
- 每个
commit都有一个唯一的哈希值。 - 它指向一个
tree(项目根目录结构),而tree又指向多个blob(文件内容)。 - 同时,
commit还记录了它的“父提交”(parent),从而形成一条可追溯的历史链。
三、三大区域:你操作的是哪个“区”?
Git 将项目管理分为三个区域:
| 区域 | 说明 | 对应命令 |
|---|---|---|
| 工作区(Working Directory) | 你正在编辑的文件(磁盘上的实际文件) | edit file.txt |
| 暂存区(Staging Area / Index) | 你准备提交的“待打包”文件列表 | git add |
| 版本库(Repository) | 已提交的快照历史(.git 目录中) | git commit |
👉 流程:
工作区修改 → git add → 暂存区 → git commit → 版本库
四、分支的本质:指针!
在 Git 中,分支其实就是指向某个 commit 的指针。
- 默认分支叫
master或main,它指向最新的 commit。 - 当你创建新分支:
git branch dev,Git 只是新建一个叫dev的指针,指向当前 commit。 - 切换分支:
git checkout dev,HEAD 指针指向dev。 - 提交新 commit 时,该分支的指针自动前移。
✅ 所以:分支创建极快,几乎没有成本,这是 Git 鼓励多分支开发的原因。
Git 原理一句话
Git 是一个用 SHA-1 哈希组织“快照”的分布式系统,通过 blob、tree、commit 三种对象构建历史,用指针实现轻量分支,所有数据本地存储,确保高效、安全、可追溯。
📌 类比理解:
想象你在写一本小说,Git 就是你每写完一章就拍照存档,每张照片编号唯一,且注明“上一章是哪张”。你可以随时回到任意一章,还能分出“爱情线”“悬疑线”多个剧情分支——而这一切都存在你自己的电脑里。
二、本地操作:添加、提交、查看状态
1. 文件追踪与提交
git add file.txt # 添加单个文件到暂存区
git add file1.txt file2.txt # 添加多个文件
git add . # 添加当前目录所有修改(常用)
git add -u # 只添加已 tracked 的修改文件(不包括新增文件)
git commit -m "描述信息" # 提交暂存区内容
git commit --amend # 修改最后一次提交(合并或修改 commit message)
2. 查看状态与差异
git status # 查看工作区和暂存区状态
git diff # 查看工作区 vs 暂存区的差异
git diff --staged # 查看暂存区 vs 最近一次 commit 的差异
git diff HEAD # 查看工作区 vs 最新 commit 的全部差异
3. 版本回退与历史查看
git log # 查看提交历史
git log --oneline # 简洁显示:hash + 提交信息
git log --graph # 显示分支合并图
git log -p -2 # 显示最近两次提交的具体修改内容
git reflog # 查看本地操作历史(含 reset 记录,重要!)
git reset --hard HEAD~1 # 回退到上一个版本,丢弃所有更改
git reset --hard <commit-id> # 回退到指定 commit(彻底删除后续历史)
git reset --soft HEAD~1 # 回退但保留修改在暂存区(用于重新提交)
⚠️
reset --hard是危险操作,请确认后再执行!
三、工作区恢复策略(三种场景)
| 场景 | 操作 |
|---|---|
| 仅工作区修改,未 add | git checkout -- <file> 或 git restore <file>(Git 2.23+) |
| 已 add 到暂存区 | 先 git reset HEAD <file>,再 git checkout -- <file> |
| 已 commit,想撤销 | git reset --soft HEAD~1(保留修改)或 git revert <commit>(安全反向提交) |
📌
git rm <file>:从版本库删除文件。若误删,可用git checkout HEAD -- <file>恢复。
四、远程仓库操作(Online)
1. 配置 SSH 密钥(推荐)
ssh-keygen -t rsa -C "your_email@example.com"
# 生成密钥对:id_rsa(私钥)、id_rsa.pub(公钥)
将 ~/.ssh/id_rsa.pub 内容复制到 GitHub/GitLab 的 SSH Keys 设置中。
2. 关联远程仓库
git remote add origin git@server:path/repo.git # 关联远程仓库
git remote -v # 查看远程仓库信息
3. 克隆与推送
git clone git@server:path/repo.git # 克隆远程仓库到本地
git push -u origin master # 第一次推送并设置上游分支
git push origin main # 后续推送(注意分支名可能是 main)
git push # 已关联后可简写
🔁 分布式优势:本地提交无需联网,网络恢复后
git push即可同步。
五、分支管理(核心功能)
1. 分支操作
git branch # 查看本地分支
git branch -a # 查看本地 + 远程分支
git branch -v # 显示最新提交信息
git branch <name> # 创建分支
git branch -d <name> # 删除分支(-D 强制删除)
git checkout <name> # 切换分支
git checkout -b <name> # 创建并切换分支(常用)
2. 合并与冲突处理
git merge <branch> # 将指定分支合并到当前分支
# 若有冲突,手动编辑文件 → git add → git commit 完成合并
git log --graph --oneline # 查看分支合并图
合并策略建议:
git merge --no-ff <branch>:禁用快进合并,保留合并历史(推荐团队使用)- 默认
fast-forward合并会丢失分支痕迹
3. 团队协作分支
git checkout -b dev origin/dev # 创建本地分支并跟踪远程分支
git branch --set-upstream-to=origin/dev dev # 设置上游分支
git pull # 拉取远程更新(等价于 fetch + merge)
git fetch --all # 获取所有远程分支最新信息
💡
git pull可能自动合并导致冲突,建议先fetch再手动merge。
六、临时保存:Stash(储藏区)
当你需要切换分支但不想提交半成品时:
git stash # 保存当前修改到栈中
git stash list # 查看所有储藏
git stash pop # 恢复最近一次 stash 并从栈中删除
git stash apply # 恢复但不清除 stash
git stash drop # 删除最近一次 stash
git stash clear # 清空所有 stash
七、标签管理(Tag)
用于标记发布版本(如 v1.0.0)
git tag v1.0 # 给当前 commit 打标签
git tag v0.9 <commit-id> # 给指定 commit 打标签
git tag -a v1.0 -m "Release 1.0" # 带注释的标签
git tag -s v1.0 -m "Signed release" # 使用 GPG 签名标签(需配置)
git tag # 查看所有标签
git show v1.0 # 查看标签详情
# 推送标签
git push origin v1.0 # 推送单个标签
git push origin --tags # 推送所有本地标签
# 删除标签
git tag -d v1.0 # 删除本地标签
git push origin :refs/tags/v1.0 # 删除远程标签
八、效率提升:别名配置(Alias)
Linux Shell 别名(推荐添加到 .bashrc 或 .zshrc)
# Git 快捷方式
alias gta='git add .'
alias gts='git status'
alias gtc='git commit -m'
alias gpl='git pull'
alias gps='git push'
# Docker 示例
alias dkb='docker build'
alias dki='docker images'
alias dkr='docker run'
alias dkp='docker ps'
# ls 彩色输出
alias ll='ls -alF'
alias la='ls -al --color=auto'
alias grep='grep --color=auto'
✅ 加载方式:
source ~/.bashrc
九、紧急恢复技巧(慎用)
# 强制重置本地分支为远程状态(丢弃所有本地更改)
git fetch origin
git reset --hard origin/master
# 撤销已 push 的提交(谨慎!影响他人)
git revert <commit-id> # 推荐:生成反向提交,安全
git reset --hard HEAD~1 && git push -f # 不推荐:强制覆盖远程历史
❗ 强制推送(-f)会覆盖他人工作,请仅在个人分支或明确协调后使用!
总结口诀(便于记忆)
✅ 本地操作:add → commit → status → log
✅ 分支管理:checkout -b → merge → push
✅ 远程同步:clone → pull → push
✅ 紧急情况:reflog → reset → stash
✅ 团队协作:--no-ff → pull → review
📌 学习建议路径:
1. 先掌握 add, commit, status, log
2. 理解 工作区 / 暂存区 / 版本库 三层结构
3. 熟练使用分支与合并
4. 掌握远程协作流程
5. 最后学习高级功能(stash, tag, rebase)
评论列表,共 0 条评论
暂无评论