Git 操作与原理
Git 基础原理
Git 是一个分布式版本控制系统,它通过创建文件系统快照和变更引用来管理项目历史。
核心概念
- 三个区域:
- 工作区(Working Directory):实际的文件目录
- 暂存区(Staging Area):保存下次要提交的文件信息
- 仓库(Repository):保存项目的元数据和对象数据库
- 四种文件状态:
- Untracked:未被跟踪的文件
- Unmodified:已跟踪但未修改的文件
- Modified:已跟踪且被修改的文件
- Staged:已暂存的文件,准备提交
- 核心对象:
- Blob:文件内容的快照
- Tree:目录结构和文件名的快照
- Commit:指向树对象的指针,包含作者、提交者、提交信息等
- Tag:对特定提交的永久性引用
常用 Git 操作
配置设置
# 设置用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 查看配置
git config --list
基本操作
# 初始化新仓库
git init
# 克隆远程仓库
git clone <repository_url>
# 查看文件状态
git status
# 添加文件到暂存区
git add <file> # 添加特定文件
git add . # 添加所有修改
# 提交更改
git commit -m "Commit message"
# 查看历史日志
git log
git log --oneline --graph
分支操作
# 创建分支
git branch <branch_name>
# 切换分支
git checkout <branch_name>
# 或使用新语法
git switch <branch_name>
# 创建并切换分支
git checkout -b <branch_name>
# 或使用新语法
git switch -c <branch_name>
# 合并分支
git merge <branch_name>
# 删除分支
git branch -d <branch_name> # 安全删除
git branch -D <branch_name> # 强制删除
远程操作
# 添加远程仓库
git remote add origin <repository_url>
# 推送到远程
git push origin <branch_name>
# 拉取远程更新
git fetch origin
git pull origin <branch_name>
# 查看远程仓库信息
git remote -v
高级操作
变基(Rebase)
git rebase <base_branch>
变基会将当前分支的提交”移动”到目标分支的最新提交之后,创建一个更加线性的提交历史。
贮藏(Stash)
# 保存当前工作进度
git stash save "工作描述"
# 查看贮藏列表
git stash list
# 应用贮藏
git stash apply stash@{0}
# 应用并删除贮藏
git stash pop
撤销操作
# 撤销工作区的修改
git checkout -- <file>
# 或使用新语法
git restore <file>
# 取消暂存
git reset HEAD <file>
# 或使用新语法
git restore --staged <file>
# 撤销提交
git reset --soft HEAD^ # 保留工作区和暂存区内容
git reset --mixed HEAD^ # 保留工作区内容,清空暂存区(默认)
git reset --hard HEAD^ # 同时清空工作区和暂存区
标签操作
# 创建标签
git tag v1.0.0
# 创建带注释的标签
git tag -a v1.0.0 -m "Version 1.0.0"
# 推送标签
git push origin v1.0.0
git push origin --tags
Git 内部原理
-
对象存储:Git 将所有内容作为对象存储在
.git/objects
目录中,使用 SHA-1 哈希值作为唯一标识 -
引用管理:分支、标签等本质上都是指向特定提交对象的引用,存储在
.git/refs
目录中 -
提交图:Git 通过指针构建一个有向无环图(DAG),每个提交至少有一个父提交(合并提交有多个)
-
索引:暂存区实际上是一个索引文件(
.git/index
),记录了暂存区的状态
Git 简明指南:从零开始理解
想象你正在写一篇长文章(或者开发一个程序):
- 你可能想保存多个版本,以便在需要时回到之前的状态
- 如果和朋友合作,你们需要一种方式来合并各自的修改
- 你希望知道是谁修改了什么内容,以及为什么要这样修改
Git 就是解决这些问题的工具,它就像一个时间机器,记录你文件的每一次变化。
Git 的基本概念(用实例解释)
1. 仓库(Repository)
仓库就像是一个项目的容器,包含了你的所有文件和修改历史。
例子:假设你创建了一个名为”我的小说”的文件夹,用 Git 将其初始化为仓库:
mkdir 我的小说
cd 我的小说
git init # 这会在文件夹中创建一个隐藏的 .git 目录,存储版本信息
现在你的”我的小说”文件夹就是一个 Git 仓库了!
2. 工作区、暂存区和版本库(三个区域)
这三个区域是理解 Git 的关键:
- 工作区:就是你能看到的文件夹,你在这里修改文件
- 暂存区:临时存放你已选择要记录的更改
- 版本库:永久存储已提交的版本
例子:
- 你在”我的小说”中创建了”第一章.txt”并写了内容(在工作区)
- 执行
git add 第一章.txt
(把它放入暂存区) - 执行
git commit -m "完成第一章"
(将更改永久记录到版本库)
3. 用实例理解文件状态
假设你继续写小说:
# 创建第一章
echo "从前有座山..." > 第一章.txt
# 查看状态
git status
# 会显示"第一章.txt"是未跟踪(Untracked)状态
# 添加到暂存区
git add 第一章.txt
git status
# 现在显示文件已暂存(Staged)
# 提交到版本库
git commit -m "完成第一章"
git status
# 显示"工作区干净",所有更改都已提交
# 修改文件
echo "山里有座庙..." >> 第一章.txt
git status
# 显示文件已修改(Modified)但未暂存
Git 常用操作:具体示例
1. 查看历史记录
继续上面的例子:
# 创建更多内容
echo "庙里有个老和尚..." >> 第一章.txt
git add 第一章.txt
git commit -m "第一章添加细节"
# 创建第二章
echo "老和尚给小和尚讲故事..." > 第二章.txt
git add 第二章.txt
git commit -m "添加第二章"
# 查看历史
git log
# 会显示所有提交记录,包括作者、日期和提交消息
2. 分支:并行开发多个情节
分支就像是小说的不同情节发展路线:
# 创建并切换到新分支"另一个结局"
git branch 另一个结局
git checkout 另一个结局
# 或简写为: git checkout -b 另一个结局
# 在这个分支上修改结局
echo "结局:大团圆" > 结局.txt
git add 结局.txt
git commit -m "写了一个大团圆结局"
# 切回主分支
git checkout main
# 在主分支写不同的结局
echo "结局:悲剧收场" > 结局.txt
git add 结局.txt
git commit -m "写了一个悲剧结局"
# 现在你有两个版本的结局!
3. 合并分支
假设你决定采用”另一个结局”:
# 确保在主分支
git checkout main
# 合并"另一个结局"分支
git merge 另一个结局
# 会出现冲突,因为两个分支都修改了结局.txt
# 解决冲突
# 编辑结局.txt,决定保留哪个版本或合并两者
# 然后:
git add 结局.txt
git commit -m "选择了大团圆结局"
形象类比:Git 是什么?
-
Git 像照相机:每次提交就像给项目拍一张快照,以后可以回到任何一张照片的状态
-
Git 像时光机:可以回到过去的任何一个提交点,查看或恢复那时的状态
-
分支像平行宇宙:你可以同时在不同的分支(宇宙)中开发,互不干扰,需要时再合并
实际工作流程(简化版)
- 克隆或创建仓库:
git clone 网址
或git init
- 创建分支:
git checkout -b 功能名称
- 修改文件:正常编辑文件
- 提交更改:
git add .
然后git commit -m "描述"
- 推送到远程:
git push origin 分支名
- 合并你的改动:通过 Pull Request 或
git merge
最基本的几个命令:git add
、git commit
、git status
、git checkout
,