Git操作和原理

By pocaster

Git 操作与原理

Git 基础原理

Git 是一个分布式版本控制系统,它通过创建文件系统快照和变更引用来管理项目历史。

核心概念

  1. 三个区域
    • 工作区(Working Directory):实际的文件目录
    • 暂存区(Staging Area):保存下次要提交的文件信息
    • 仓库(Repository):保存项目的元数据和对象数据库
  2. 四种文件状态
    • Untracked:未被跟踪的文件
    • Unmodified:已跟踪但未修改的文件
    • Modified:已跟踪且被修改的文件
    • Staged:已暂存的文件,准备提交
  3. 核心对象
    • 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 内部原理

  1. 对象存储:Git 将所有内容作为对象存储在 .git/objects 目录中,使用 SHA-1 哈希值作为唯一标识

  2. 引用管理:分支、标签等本质上都是指向特定提交对象的引用,存储在 .git/refs 目录中

  3. 提交图:Git 通过指针构建一个有向无环图(DAG),每个提交至少有一个父提交(合并提交有多个)

  4. 索引:暂存区实际上是一个索引文件(.git/index),记录了暂存区的状态

Git 简明指南:从零开始理解

想象你正在写一篇长文章(或者开发一个程序):

  • 你可能想保存多个版本,以便在需要时回到之前的状态
  • 如果和朋友合作,你们需要一种方式来合并各自的修改
  • 你希望知道是谁修改了什么内容,以及为什么要这样修改

Git 就是解决这些问题的工具,它就像一个时间机器,记录你文件的每一次变化。

Git 的基本概念(用实例解释)

1. 仓库(Repository)

仓库就像是一个项目的容器,包含了你的所有文件和修改历史。

例子:假设你创建了一个名为”我的小说”的文件夹,用 Git 将其初始化为仓库:

mkdir 我的小说
cd 我的小说
git init  # 这会在文件夹中创建一个隐藏的 .git 目录,存储版本信息

现在你的”我的小说”文件夹就是一个 Git 仓库了!

2. 工作区、暂存区和版本库(三个区域)

这三个区域是理解 Git 的关键:

  • 工作区:就是你能看到的文件夹,你在这里修改文件
  • 暂存区:临时存放你已选择要记录的更改
  • 版本库:永久存储已提交的版本

例子

  1. 你在”我的小说”中创建了”第一章.txt”并写了内容(在工作区
  2. 执行 git add 第一章.txt(把它放入暂存区
  3. 执行 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 是什么?

  1. Git 像照相机:每次提交就像给项目拍一张快照,以后可以回到任何一张照片的状态

  2. Git 像时光机:可以回到过去的任何一个提交点,查看或恢复那时的状态

  3. 分支像平行宇宙:你可以同时在不同的分支(宇宙)中开发,互不干扰,需要时再合并

实际工作流程(简化版)

  1. 克隆或创建仓库git clone 网址git init
  2. 创建分支git checkout -b 功能名称
  3. 修改文件:正常编辑文件
  4. 提交更改git add . 然后 git commit -m "描述"
  5. 推送到远程git push origin 分支名
  6. 合并你的改动:通过 Pull Request 或 git merge

最基本的几个命令:git addgit commitgit statusgit checkout

Tags: Gamedev Public