Git 原理与使用详解(上)
1. 初识 Git
在软件开发的全流程中,版本控制是保障协作效率、规避开发风险的核心基石。Git 作为目前最流行、最强大的分布式版本控制系统,已渗透到从个人开发到大型企业级项目的每一个环节。
提出问题
编写文档或代码时,为防止丢失或失误,常需复制多个副本(如 v1, v2, 最终版等)。随着版本增多,管理困难且容易混淆修改内容。
解决方案
使用版本控制器。它能记录工程的每一次改动和版本迭代,方便多人协同作业。目前主流的是 Git。
注意事项:
- Git 主要跟踪文本文件的改动(如 TXT、网页、代码)。
- 对于图片、视频等二进制文件,只能管理版本串连,无法跟踪具体变化细节。
2. Git 安装
Git 是开放源代码的代码托管工具,支持 Linux、Unix、Mac 和 Windows 平台。
2.1 Linux — CentOS 系统安装 Git
以 CentOS 7.6 为例:
检查是否安装:
git
若提示 command not found,则未安装。
安装命令:
sudo yum -y install git
查看版本:
git --version
2.2 Linux — Ubuntu 系统安装 Git
以 Ubuntu 22.04 为例:
检查是否安装:
git
若提示 Command 'git' not found,可尝试安装。
安装命令:
sudo apt-get install git -y
查看版本:
git --version
2.3 Windows 系统安装 Git
Windows 用户可前往官网下载并安装 Git for Windows。
3. Git 基本操作
3.1 创建 Git 本地仓库
仓库是进行版本控制的文件目录。创建 Git 本地仓库的命令为 git init。
执行后当前目录下会多出一个 .git 隐藏目录,这是 Git 用来跟踪管理仓库的,不要手动修改其中文件。
3.2 配置 Git 本地仓库
安装 Git 后首先设置用户名和邮箱:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
--global 表示该机器上所有 Git 仓库都使用此配置。若不同仓库需不同配置,可省略该选项,但需在仓库内执行。
查看配置:
git config -l
删除配置:
git config [--global] --unset user.name
git config [--global] --unset user.email
3.3 认识工作区、暂存区、版本库
- 工作区:电脑上写代码或文件的目录。
- 暂存区:英文叫 stage 或 index,存放在
.git/index文件中。 - 版本库:英文名 repository,即
.git目录,包含所有被 Git 管理的文件历史。
工作机制:
- 创建版本库时,Git 自动创建唯一的 master 分支及指向 master 的指针 HEAD。
- 对文件执行
git add时,更新暂存区目录树索引。 - 执行
git commit时,master 分支更新,暂存区内容真正写入版本库。
注意:仅新建或粘贴文件不算向仓库新增,必须通过 git add 和 git commit 才能提交管理。
3.4 添加文件 — 场景一
在包含 .git 的目录下新建文件,使用 git add 添加到暂存区:
- 添加一个或多个文件:
git add [file1] [file2] ... - 添加指定目录:
git add [dir] - 添加当前目录下所有改动:
git add .
提交暂存区内容到本地仓库:
- 提交全部内容:
git commit -m "message" - 提交指定文件:
git commit [file1] [file2] ... -m "message"
查看历史提交记录:
git log
使用 --pretty=oneline 可简化输出。Commit ID 是 SHA1 计算出的十六进制字符串。
3.5 查看.git 文件
.git 目录结构解析:
- index:暂存区,
git add后更新。 - HEAD:默认指向 master 分支的指针。
- refs/heads/master:保存当前 master 分支的最新 commit id。
- objects:对象库,包含各种版本库对象及内容,经过 SHA 加密。
3.6 添加文件 — 场景二
若新增了两个文件但未全部 add,直接 commit 只会提交已暂存的文件。遗漏的文件需再次 add 后 commit。
3.7 修改文件
Git 跟踪的是修改而非文件本身。使用 git status 查看上次提交后的修改状态。
查看差异:
git diff [file]
# 或查看版本库与工作区区别
git diff HEAD -- [file]
确认无误后 git add 并提交。
3.8 版本回退
使用 git reset 命令回退版本。
语法:git reset [--soft | --mixed | --hard] [HEAD]
--mixed(默认):暂存区退回,工作区不变。--soft:版本库退回,暂存区和工作区不变。--hard:暂存区和工作区均退回(慎用,未提交代码会丢失)。
HEAD 引用说明:
HEAD:当前版本HEAD^:上一个版本HEAD~1:上一个版本commit_id:指定版本
若 commit 信息被清屏,可使用 git reflog 找回操作记录。
3.9 撤销修改 — 情况一
工作区代码未 add:
使用 git checkout -- [file] 恢复工作区文件到最近一次 add 或 commit 状态。
注意:-- 不可省略。
3.10 撤销修改 — 情况二
已 add 但未 commit:
使用 git reset 将暂存区退回,然后丢弃工作区修改。
3.11 撤销修改 — 情况三
已 add 且 commit:
使用 git reset --hard HEAD^ 回退到上一个版本。前提是该版本未推送到远程。
3.12 删除文件
删除也是修改操作。
- 仅删除工作区文件:
rm file - 从版本库删除:
git rm file,然后commit。 误删可使用git checkout -- [file]恢复。
4. 分支管理
4.1 理解分支
分支是并行开发的机制。每次提交形成一条时间线,即分支。默认主分支为 master。 HEAD 指向当前分支,master 指向提交。
4.2 创建、切换、合并分支
- 创建分支:
git branch dev - 切换分支:
git checkout dev- 切换后 HEAD 指向新分支。
- 合并分支:
git merge dev- Fast-forward 模式:直接将 master 指向 dev 当前提交,速度快。
4.3 删除分支
在当前分支外删除:git branch -d dev
若当前处于该分支下,无法删除。
4.4 合并冲突
当两个分支修改了同一文件的同一部分时,会产生冲突。
Git 会用 <<<<<<<, =======, >>>>>>> 标记冲突内容。
解决步骤:
- 手动编辑文件解决冲突。
git add标记解决。git commit完成合并。
4.5 分支模式
Fast-forward 模式会丢失分支历史信息。禁用 Fast-forward 可保留合并节点:
git merge --no-ff -m "merge message" dev
这样在历史中能看到明确的合并提交。
4.6 分支策略
- master:稳定,仅用于发布新版本。
- dev:开发分支,不稳定,日常开发在此进行。
- 功能分支:每个开发者或个人任务创建独立分支,完成后合并至 dev。
4.7 Bug 分支
修复线上 bug 时,基于 master 创建临时分支修复,合并后再删除。
若当前工作区有未提交代码,可使用 git stash 储藏现场:
git stash list
# 恢复现场
git stash pop
建议先在本地分支合并 master 解决潜在冲突,再让 master 合并该分支。
4.8 删除临时分支
新功能开发完成后,合并并删除 feature 分支。 若中途停止开发,强制删除未完成分支:
git branch -D feature_name
分支允许快速创建、切换和删除,既安全又不影响他人工作。

