引言
在前面的文章中,我们学习了 Linux 环境下的各种编程技术。然而,无论是个人项目还是团队协作,代码版本管理都是不可或缺的核心技能。
Git 是目前最流行的分布式版本控制系统。它不仅能记录每一次代码变更、回溯任意历史版本,还能通过分支机制让多人并行开发互不干扰。本文将从 Git 的核心概念出发,系统讲解分支管理、远程仓库协作、冲突解决等实用技能。
第一部分:Git 基础概念
一、四个工作区
| 区域 | 作用 | 命令 | 数据存储位置 |
|---|---|---|---|
| 工作区 | 编写代码 | — | 项目文件夹 |
| 暂存区 | 挑选要提交的修改 | git add | .git/index |
| 本地仓库 | 保存版本历史 | git commit | .git/objects |
| 远程仓库 | 云端协作 | git push | 服务器 |
二、初始化与首次提交
# 1. 创建项目文件夹 mkdir my_project cd my_project # 2. 初始化 Git 仓库(生成 .git 隐藏文件夹) git init # 3. 配置用户名和邮箱(首次使用必须配置) git config --global user.name "你的名字" git config --global user.email "你的邮箱" # 4. 创建文件并编写代码 vim main.c # 5. 添加到暂存区 git add main.c # 6. 提交到本地仓库 git commit -m "版本1:创建主函数" # 7. 查看提交历史 git log三、代码提交流程
第二部分:分支管理
一、什么是分支
分支是 Git 最强大的特性之一。它允许你从主线上"分叉"出一条独立的开发线,在上面自由修改而不影响主线,完成后再合并回去。
为什么要用分支?
| 场景 | 不用分支 | 用分支 |
|---|---|---|
| 开发新功能 | 在主线上改,改坏了全完 | 在 dev 分支上改,改坏了删掉重来 |
| 修复 bug | 暂停新功能开发 | 切到 hotfix 分支修复,两不耽误 |
| 多人协作 | 互相覆盖代码 | 各干各的,最后合并 |
| 版本发布 | 不知道哪个版本稳定 | master 永远是稳定版本 |
二、分支操作命令
1. 查看分支
git branch # 查看所有本地分支,当前分支前有 * 号
git branch -a # 查看所有分支(包括远程)
2. 创建分支
git branch dev # 创建名为 dev 的分支(基于当前 HEAD)
3. 切换分支
git checkout dev # 切换到 dev 分支 git switch dev # Git 2.23+ 新命令,功能相同
切换分支时工作区会随之改变——不同分支的文件内容可能完全不同。
4. 创建并切换
git checkout -b feature # 创建 feature 分支并立即切换过去
git switch -c feature # Git 2.23+ 等效命令
5. 删除分支
git branch -d dev # 删除已合并的分支 git branch -D dev # 强制删除(即使未合并) # 注意:不能删除当前所在的分支
三、合并分支
# 1. 先切换到目标分支(通常是要保留的主分支)
git checkout master# 2. 合并 dev 分支到当前分支
git merge dev
两种合并方式:
四、查看提交历史
git log # 完整历史
git log --oneline # 单行简版
git log --graph # 图形化显示分支结构
git log --graph --oneline # 组合使用,最常用
git reflog # 查看所有操作记录(包括已删除的分支)
第三部分:保护现场
一、问题场景
你正在dev分支开发新功能,代码写了一半还没提交。突然master分支有个紧急 bug 需要修复。
直接切换分支?Git 会阻止或导致未提交的修改被覆盖。
解决方案:使用git stash暂存工作现场。
二、stash 操作
# 1. 暂存当前修改(代码"藏"起来)
git stash# 2. 现在工作区干净了,可以自由切换分支
git checkout master
# ... 修复 bug,提交 ...# 3. 回到原分支
git checkout dev# 4. 恢复暂存的修改
git stash pop# 5. 查看暂存列表
git stash list
使用建议:
未提交的代码不要带着切换分支,先
stash或commitstash适合临时保存,长期保存应提交到分支
第四部分:远程仓库
一、SSH 密钥配置
远程仓库通过 SSH 密钥验证身份,需要先配置密钥对。
# 1. 生成 SSH 密钥对
ssh-keygen -t rsa -C "your_email@example.com"
# 连续回车使用默认路径,不设密码# 2. 查看公钥(复制全部内容)
cat ~/.ssh/id_rsa.pub# 3. 将公钥添加到 Gitee/GitHub 的 SSH 公钥设置中
# 4. 测试连通性
ssh -T git@gitee.com # Gitee
ssh -T git@github.com # GitHub
# 成功提示:successfully authenticated
二、克隆与推送
# 克隆远程仓库到本地
git clone git@gitee.com:username/repo.git# 进入项目目录
cd repo# 修改代码后提交
git add .
git commit -m "修改说明"# 先拉取远程最新代码(防止冲突)
git pull# 推送到远程
git push origin master# 或简写
git push
三、拉取远程更新
# 拉取并合并远程代码
git pull origin master# 如果远程没有更新
# 输出:Already up to date.
推送前一定先pull,这是团队协作的第一准则。
第五部分:合并冲突
一、冲突是怎么产生的
当两个人修改了同一个文件的同一行,Git 无法自动判断该保留谁的版本,就会产生冲突。
二、冲突标记
冲突文件会被 Git 标记成这样:
<<<<<<< HEAD 这里是你的代码(本地版本) ======= 这里是远程的代码(别人推送的版本) >>>>>>> commit_hash三、解决冲突
# 1. 拉取远程代码,发现冲突
git pull# 2. 手动编辑冲突文件,删除冲突标记
vim main.c
# 保留需要的代码,删除 <<<<<<<, =======, >>>>>>># 3. 标记冲突已解决
git add main.c# 4. 提交合并结果
git commit -m "解决合并冲突"# 5. 推送到远程
git push
冲突解决的本质:Git 只是把两种修改都列出来,最终决定权在开发者手里——你需要判断哪些代码该保留。
第六部分:常用命令速查
| 命令 | 作用 |
|---|---|
git init | 初始化本地仓库 |
git clone <url> | 克隆远程仓库 |
git status | 查看工作区状态 |
git add <file> | 添加文件到暂存区 |
git commit -m "msg" | 提交到本地仓库 |
git push | 推送到远程仓库 |
git pull | 拉取远程更新 |
git branch | 查看分支列表 |
git branch <name> | 创建分支 |
git checkout <name> | 切换分支 |
git checkout -b <name> | 创建并切换分支 |
git merge <name> | 合并分支到当前分支 |
git branch -d <name> | 删除分支 |
git stash | 暂存工作现场 |
git stash pop | 恢复暂存 |
git log | 查看提交历史 |
git log --oneline --graph | 图形化查看分支历史 |
git reflog | 查看所有操作记录 |
git diff | 查看工作区与暂存区的差异 |
总结
一、核心概念
| 概念 | 本质 |
|---|---|
| 工作区 | 写代码的文件夹 |
| 暂存区 | 挑选要提交的修改 |
| 本地仓库 | .git 文件夹,存储版本历史 |
| 远程仓库 | GitHub/Gitee 云端存储 |
| 分支 | 指向某个提交的指针 |
| HEAD | 指向当前分支的指针 |
二、核心工作流
三、一句话记忆
Git 用四个区域管理代码版本,用分支实现并行开发互不干扰。工作区写代码,git add到暂存区,git commit到本地仓库,git push到远程仓库。多人协作时先pull再push,遇到冲突手动解决。