linux学习进展 git详解
在Linux学习过程中版本控制是必备技能之一而Git作为目前全球最流行的分布式版本控制系统更是后端开发、运维工作中的核心工具。它由Linux之父Linus Torvalds为管理Linux内核开发而创建凭借高效的分支管理、分布式架构和数据完整性保障成为现代软件开发的基础设施。本笔记将从Git的核心概念、Linux环境下的安装配置、基础操作、进阶技巧及常见问题入手全面详解Git的使用方法助力快速掌握版本控制能力。一、Git核心概念必懂基础学习Git的关键的是理解其核心逻辑——分布式版本控制区别于SVN等集中式版本控制系统Git的每个开发者都拥有完整的仓库副本可离线工作且分支操作轻量高效。核心概念可分为“三大区域”“四种状态”和“核心对象”结合Linux命令行操作更容易理解其工作流程。1. 三大区域核心工作流Git的所有操作都围绕三个核心区域展开三者之间的流转构成了Git的基础工作流程结合Linux目录结构可直观理解为工作区Working Directory即我们实际编辑文件的目录也是Linux系统中可见的普通文件夹比如我们创建的项目目录所有文件的修改都在这个区域进行。暂存区Staging Area / Index临时存放“准备提交”的文件变更相当于一个“购物车”我们可以将工作区的修改选择性添加到暂存区确认无误后再统一提交到本地仓库。在Linux中暂存区的信息存储在.git目录下的index文件中。本地仓库Local Repository保存完整的版本历史记录是Git的“核心数据库”当我们将暂存区的内容提交后修改会被永久保存到本地仓库形成一个新的版本。Linux中本地仓库对应项目目录下的隐藏文件夹.git包含了所有版本元数据。补充远程仓库Remote Repository如GitHub、Gitee、GitLab等用于团队共享和备份本质是一个远程的Git仓库通过网络与本地仓库同步这是多人协作的核心载体。2. 四种文件状态文件在Git中会经历四种状态所有Git命令本质上都是在切换文件的状态结合Linux命令行操作状态流转如下未跟踪Untracked新创建的文件Git尚未对其进行管理Linux中使用ls命令可看到该文件但git status会提示“未跟踪文件”。已修改Modified工作区的文件被修改后尚未添加到暂存区此时文件与本地仓库中的最新版本存在差异。已暂存Staged通过git add命令将已修改的文件添加到暂存区此时文件处于“待提交”状态等待被提交到本地仓库。已提交Committed通过git commit命令将暂存区的文件提交到本地仓库此时文件被永久保存为一个版本状态稳定。3. 核心对象模型Git将所有数据存储为对象确保数据不被篡改核心有四种对象支撑整个版本管理体系Blob对象存储文件的具体内容相当于文件的“快照”不包含文件名和目录信息。Tree对象存储目录结构和文件关联记录某个目录下的所有文件Blob对象和子目录Tree对象。Commit对象存储提交信息包括提交者、提交时间、提交说明以及指向当前版本Tree对象的指针每个Commit对象对应一个版本。Tag对象用于标记重要版本如发布版本关联某个Commit对象方便快速定位到指定版本。二、Linux环境下Git的安装与配置实操重点Linux系统以Ubuntu/Debian为例下安装Git非常简单通过包管理器即可完成配置过程主要是设置用户信息确保提交记录可追溯。1. 安装Git使用apt包管理器安装执行以下命令需root权限或加sudo# 更新软件包列表 sudo apt update # 安装Git sudo apt install git -y # 验证安装是否成功查看Git版本 git --version若安装成功会输出类似“git version 2.34.1”的版本信息若为CentOS/RHEL系统可使用yum命令安装sudo yum install git -y。2. 初始配置必做步骤安装完成后需配置用户姓名和邮箱这会作为每次提交的“身份标识”关联到提交记录中配置分为三个级别优先级本地仓库级 用户级 系统级。# 配置用户级当前用户所有仓库生效最常用 git config --global user.name Your Name git config --global user.email youremail.com # 可选配置本地仓库级仅当前仓库生效覆盖全局配置 # 需先进入Git仓库目录再执行 git config user.name Work Name git config user.email workemail.com # 可选配置系统级所有用户所有仓库生效需root权限 sudo git config --system user.name System Name sudo git config --system user.email systememail.com # 查看所有配置信息 git config --list补充配置为了提升使用效率可配置Git别名简化命令和默认编辑器例如# 配置别名ststatuscocheckoutbrbranchcicommit git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit # 配置默认编辑器为vimLinux常用 git config --global core.editor vim # 配置凭证存储避免每次推送都输入账号密码 git config --global credential.helper store三、Git基础操作Linux命令行实操Git的基础操作围绕“仓库初始化/克隆→文件修改→暂存→提交→推送/拉取”展开所有操作均在Linux命令行中执行结合实例讲解更易上手。1. 仓库操作初始化/克隆仓库是Git管理版本的载体分为本地仓库和远程仓库核心操作有初始化本地仓库和克隆远程仓库。# 1. 初始化本地仓库将当前Linux目录变为Git仓库 mkdir my-project # 创建项目目录 cd my-project # 进入目录 git init # 初始化Git仓库生成.git隐藏目录 # 2. 克隆远程仓库下载远程仓库到本地包含完整版本历史 # 格式git clone 远程仓库地址 [本地目录名可选] git clone https://github.com/username/repo.git # 克隆到同名目录 git clone https://github.com/username/repo.git my-repo # 克隆到指定目录 git clone --depth 1 https://github.com/username/repo.git # 浅克隆仅最新版本节省空间2. 基础工作流操作核心高频从文件修改到提交到本地仓库再到推送到远程仓库是日常开发中最常用的流程步骤如下# 1. 查看当前仓库状态高频命令随时掌握文件状态 git status # 详细状态 git status -s # 精简状态输出短格式 # 2. 新建/修改文件Linux操作与Git无关 touch README.md # 新建文件 echo Git学习笔记 README.md # 向文件写入内容 # 3. 将文件添加到暂存区从工作区→暂存区 git add README.md # 添加单个文件 git add . # 添加当前目录所有变更新增、修改不含删除 git add -A # 添加所有变更新增、修改、删除 git add -p # 交互式添加按块选择修改内容精准控制 # 4. 将暂存区内容提交到本地仓库从暂存区→本地仓库 # 必须添加提交说明遵循“类型: 描述”的规范如feat: 新增README文件 git commit -m feat: add README.md # 可选跳过暂存区直接提交已跟踪文件的修改 git commit -am fix: 修改README内容 # 5. 关联远程仓库首次推送时需要 git remote add origin https://github.com/username/repo.git # origin是远程仓库别名可自定义 # 6. 查看远程仓库信息 git remote -v # 查看远程仓库地址和别名 # 7. 推送到远程仓库本地仓库→远程仓库 git push -u origin main # 首次推送-u关联分支后续可直接用git push git push # 后续推送默认推送到关联的远程分支 # 8. 拉取远程仓库更新远程仓库→本地仓库同步同事提交的内容 git pull origin main # 拉取远程main分支的更新 git pull # 后续拉取默认拉取关联分支的更新3. 文件状态撤销与删除开发中难免出现误操作Git提供了多种撤销方式需根据文件状态选择对应命令避免误删重要内容。# 1. 撤销工作区修改文件未添加到暂存区恢复到最近提交状态 git checkout -- README.md # 旧版写法 git restore README.md # 新版Git推荐写法更语义化 # 2. 撤销暂存区修改文件已add未commit将文件撤回工作区 git reset HEAD README.md # 旧版写法 git restore --staged README.md # 新版Git推荐写法 # 3. 删除文件同时删除工作区和暂存区的文件 git rm README.md # 删除文件并添加到暂存区需后续commit git rm -f README.md # 强制删除若文件已修改且未add # 4. 仅删除暂存区文件保留工作区文件不删除本地实际文件 git rm --cached README.md四、Git进阶操作提升效率应对复杂场景掌握基础操作后需学习分支管理、版本回退、暂存工作区等进阶技巧应对多人协作、多功能并行开发等复杂场景这也是Git的核心优势所在。1. 分支管理多人协作核心分支相当于“平行宇宙”可以在不影响主分支的前提下开发新功能、修复bug开发完成后再合并到主分支Linux命令行操作如下# 1. 查看分支 git branch # 查看本地分支*标记当前分支 git branch -r # 查看远程分支 git branch -a # 查看所有分支本地远程 # 2. 创建分支 git branch feat/login # 创建功能分支feat/xxx命名规范 git branch fix/bug1 # 创建bug修复分支fix/xxx命名规范 # 3. 切换分支 git checkout feat/login # 旧版写法 git switch feat/login # 新版推荐写法 # 4. 创建并切换分支常用一步完成 git checkout -b feat/pay # 旧版写法 git switch -c feat/pay # 新版推荐写法 # 5. 合并分支将功能分支合并到主分支 git switch main # 先切换到主分支 git merge feat/login # 将feat/login分支的内容合并到main分支 # 6. 删除分支分支合并完成后删除避免冗余 git branch -d feat/login # 删除已合并的分支 git branch -D feat/login # 强制删除未合并的分支慎用 # 7. 关联远程分支本地分支与远程分支绑定 git branch --set-upstream-toorigin/feat/login feat/login # 8. 删除远程分支 git push origin --delete feat/login分支规范团队协作必备main/master主分支仅用于发布版本禁止直接提交代码dev开发分支团队协作主分支由各功能分支合并而来feat/xxx功能分支从dev创建开发完成后合并到devfix/xxxbug修复分支从dev创建修复后合并到devhotfix/xxx线上紧急修复分支从main创建修复后合并到main与dev。2. 版本回退撤销错误提交当提交了错误代码时需要回退到之前的正确版本根据是否已推送到远程选择不同的回退方式避免修改版本历史导致协作冲突。# 1. 查看提交历史获取需要回退的版本号即commit-id git log # 详细历史按q退出 git log --oneline # 简洁历史一行显示commit-id为前7位 git log --graph # 图形化显示清晰查看分支合并记录 # 2. 本地未push回退版本可选择保留或丢弃修改 # 软回退保留工作区和暂存区修改仅撤销commit推荐可重新提交 git reset --soft HEAD~1 # HEAD~1表示回退到上一个版本HEAD~n回退n个版本 # 混合回退默认保留工作区修改清空暂存区 git reset --mixed HEAD~1 # 硬回退彻底丢弃工作区和暂存区修改恢复到指定版本慎用 git reset --hard HEAD~1 git reset --hard 1234567 # 用commit-id精准回退到指定版本 # 3. 已push到远程回退版本不修改历史创建新提交 # 1. 查看错误提交的commit-id git log --oneline # 2. 创建回滚提交将代码恢复到指定版本新增一条提交记录 git revert 1234567 # 1234567为错误提交的commit-id # 3. 推送到远程同步回滚结果 git push origin main3. 暂存工作区stash高频实用开发中遇到紧急任务如修复线上bug但当前工作区的代码未完成不想提交半成品可使用stash命令暂存工作区切换分支处理完紧急任务后再恢复暂存内容。# 1. 暂存当前工作区所有修改包括未跟踪文件 git stash -u # -u参数包含未跟踪文件如新建的文件 # 2. 查看所有暂存记录 git stash list # 显示格式stash{0}: WIP on 分支名: 提交说明 # 3. 恢复暂存的工作保留暂存记录 git stash apply stash{0} # stash{0}为暂存索引可省略默认恢复最近一次 # 4. 恢复并删除暂存记录常用避免暂存堆积 git stash pop stash{0} # 5. 清空所有暂存记录 git stash clear4. 差异对比查看修改内容开发中需经常查看文件的修改内容避免误提交Git提供diff命令可对比工作区、暂存区、本地仓库之间的差异。# 1. 对比工作区与暂存区的差异未add的修改 git diff # 2. 对比暂存区与本地仓库的差异已add未commit的修改 git diff --staged # 3. 对比两个分支的差异 git diff main..feat/login # 对比main和feat/login分支的差异 # 4. 对比两个版本的差异用commit-id git diff 1234567..7654321五、Git常见问题与避坑指南Linux环境专属在Linux命令行使用Git时容易遇到权限不足、中文乱码、远程连接失败等问题以下是高频问题及解决方案1. 权限不足Permission denied问题执行git命令时提示权限不足如“Permission denied: .git/objects”。解决方案修改仓库目录的权限或使用sudo执行命令不推荐长期使用推荐方式# 修改仓库目录的所有者当前用户 sudo chown -R $USER:$USER my-project/ # 修改仓库目录的权限读、写、执行 chmod -R 755 my-project/2. 中文乱码问题问题Linux命令行中git log查看中文提交说明时显示乱码。解决方案配置Git的字符编码设置为UTF-8git config --global core.quotepath false # 禁止对路径进行编码 git config --global i18n.commitencoding utf-8 # 提交信息编码 git config --global i18n.logoutputencoding utf-8 # 日志输出编码 # 临时设置终端编码避免终端本身乱码 export LESSCHARSETutf-83. 远程仓库连接失败SSH方式问题使用SSH地址克隆/推送远程仓库时提示“Permission denied (publickey)”。解决方案配置SSH密钥将公钥添加到远程仓库GitHub/Gitee# 1. 生成SSH密钥一路回车无需设置密码 ssh-keygen -t ed25519 -C youremail.com # 2. 查看公钥内容 cat ~/.ssh/id_ed25519.pub # 3. 将公钥复制添加到GitHub/Gitee的SSH密钥设置中 # 4. 测试SSH连接 ssh -t gitgithub.com # GitHub测试 ssh -t gitgitee.com # Gitee测试 # 若提示“Hi username! Youve successfully authenticated”说明连接成功4. 合并冲突Merge conflict问题多人协作时修改同一文件的同一部分合并分支时出现冲突Git提示“Automatic merge failed; fix conflicts and then commit the result”。解决方案手动解决冲突步骤如下# 1. 查看冲突文件Git会提示冲突文件路径 git status # 2. 打开冲突文件查看冲突标记 # 冲突标记格式 # HEAD当前分支内容 # 冲突内容A # # 冲突内容B # origin/main远程分支内容 # 3. 编辑文件保留正确内容删除冲突标记、、 # 4. 标记冲突已解决提交合并结果 git add 冲突文件路径 git commit -m merge: 合并origin/main分支解决XXX冲突补充复杂冲突可使用VS Code、IDEA等工具可视化解决避免手动修改出错。六、总结与拓展本文详解了Linux环境下Git的核心知识从概念到实操覆盖了基础操作、进阶技巧和常见问题核心要点如下Git的核心是“分布式版本控制”三大区域工作区、暂存区、本地仓库的流转是基础工作流Linux环境下Git的安装通过包管理器完成初始配置需设置用户信息提升使用效率基础操作围绕“仓库→修改→暂存→提交→推送/拉取”展开高频命令需熟练记忆分支管理、版本回退、stash暂存是应对复杂场景的关键团队协作需遵循分支规范遇到权限、乱码、连接、冲突等问题可按对应解决方案快速排查。拓展Git的高级功能还包括标签管理git tag、变基操作git rebase、子模块git submodule等后续可结合实际开发场景逐步深入学习。在Linux环境中Git与命令行的结合能大幅提升版本控制效率熟练掌握Git是成为Linux后端/运维工程师的必备技能。