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):

cpp 复制代码
# 更新软件包列表
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. 初始配置(必做步骤)

安装完成后,需配置用户姓名和邮箱,这会作为每次提交的"身份标识",关联到提交记录中,配置分为三个级别,优先级:本地仓库级 > 用户级 > 系统级。

cpp 复制代码
# 配置用户级(当前用户所有仓库生效,最常用)
git config --global user.name "Your Name"
git config --global user.email "your@email.com"

# 可选:配置本地仓库级(仅当前仓库生效,覆盖全局配置)
# 需先进入Git仓库目录,再执行
git config user.name "Work Name"
git config user.email "work@email.com"

# 可选:配置系统级(所有用户所有仓库生效,需root权限)
sudo git config --system user.name "System Name"
sudo git config --system user.email "system@email.com"

# 查看所有配置信息
git config --list

补充配置:为了提升使用效率,可配置Git别名(简化命令)和默认编辑器,例如:

bash 复制代码
# 配置别名(st=status,co=checkout,br=branch,ci=commit)
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit

# 配置默认编辑器为vim(Linux常用)
git config --global core.editor "vim"

# 配置凭证存储(避免每次推送都输入账号密码)
git config --global credential.helper store

三、Git基础操作(Linux命令行实操)

Git的基础操作围绕"仓库初始化/克隆→文件修改→暂存→提交→推送/拉取"展开,所有操作均在Linux命令行中执行,结合实例讲解,更易上手。

1. 仓库操作(初始化/克隆)

仓库是Git管理版本的载体,分为本地仓库和远程仓库,核心操作有初始化本地仓库和克隆远程仓库。

bash 复制代码
# 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. 基础工作流操作(核心高频)

从文件修改到提交到本地仓库,再到推送到远程仓库,是日常开发中最常用的流程,步骤如下:

bash 复制代码
# 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提供了多种撤销方式,需根据文件状态选择对应命令,避免误删重要内容。

bash 复制代码
# 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命令行操作如下:

bash 复制代码
# 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-to=origin/feat/login feat/login

# 8. 删除远程分支
git push origin --delete feat/login

分支规范(团队协作必备):

  • main/master:主分支,仅用于发布版本,禁止直接提交代码;

  • dev:开发分支,团队协作主分支,由各功能分支合并而来;

  • feat/xxx:功能分支,从dev创建,开发完成后合并到dev;

  • fix/xxx:bug修复分支,从dev创建,修复后合并到dev;

  • hotfix/xxx:线上紧急修复分支,从main创建,修复后合并到main与dev。

2. 版本回退(撤销错误提交)

当提交了错误代码时,需要回退到之前的正确版本,根据是否已推送到远程,选择不同的回退方式,避免修改版本历史导致协作冲突。

bash 复制代码
# 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 main

3. 暂存工作区(stash,高频实用)

开发中遇到紧急任务(如修复线上bug),但当前工作区的代码未完成,不想提交半成品,可使用stash命令暂存工作区,切换分支处理完紧急任务后,再恢复暂存内容。

bash 复制代码
# 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 clear

4. 差异对比(查看修改内容)

开发中需经常查看文件的修改内容,避免误提交,Git提供diff命令,可对比工作区、暂存区、本地仓库之间的差异。

bash 复制代码
# 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执行命令(不推荐长期使用),推荐方式:

bash 复制代码
# 修改仓库目录的所有者(当前用户)
sudo chown -R $USER:$USER my-project/
# 修改仓库目录的权限(读、写、执行)
chmod -R 755 my-project/

2. 中文乱码问题

问题:Linux命令行中,git log查看中文提交说明时显示乱码。

解决方案:配置Git的字符编码,设置为UTF-8:

bash 复制代码
git config --global core.quotepath false  # 禁止对路径进行编码
git config --global i18n.commitencoding utf-8  # 提交信息编码
git config --global i18n.logoutputencoding utf-8  # 日志输出编码
# 临时设置终端编码(避免终端本身乱码)
export LESSCHARSET=utf-8

3. 远程仓库连接失败(SSH方式)

问题:使用SSH地址克隆/推送远程仓库时,提示"Permission denied (publickey)"。

解决方案:配置SSH密钥,将公钥添加到远程仓库(GitHub/Gitee):

bash 复制代码
# 1. 生成SSH密钥(一路回车,无需设置密码)
ssh-keygen -t ed25519 -C "your@email.com"
# 2. 查看公钥内容
cat ~/.ssh/id_ed25519.pub
# 3. 将公钥复制,添加到GitHub/Gitee的SSH密钥设置中
# 4. 测试SSH连接
ssh -t git@github.com  # GitHub测试
ssh -t git@gitee.com   # Gitee测试
# 若提示"Hi username! You've successfully authenticated",说明连接成功

4. 合并冲突(Merge conflict)

问题:多人协作时,修改同一文件的同一部分,合并分支时出现冲突,Git提示"Automatic merge failed; fix conflicts and then commit the result"。

解决方案:手动解决冲突,步骤如下:

bash 复制代码
# 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后端/运维工程师的必备技能。

相关推荐
念恒123061 小时前
基础IO(一切皆文件)
linux·c语言·c++·算法
小新同学^O^2 小时前
简单学习 --> 单例模式
java·学习·多线程
zhangfeng11332 小时前
CodeBuddy ai对话框上面的git docs terminal Rulds 干嘛用的,以thinkphp fastadmin 为例,插件市场
人工智能·git·编程
Irissgwe2 小时前
四、进程控制(进程创建与终止)
linux·c++·进程·系统编程·fork·进程创建·进程终止
宵时待雨2 小时前
linux笔记归纳5:进程控制
linux·运维·笔记
这个名字先用着2 小时前
形位公差速查详解
学习·汽车·制造
Jackyzhe2 小时前
从零学习Kafka:幂等与事务
数据库·学习·kafka
小新同学^O^2 小时前
简单学习 --> 文件IO
java·学习·文件io
学习使我快乐012 小时前
Express 学习
学习·node.js·express