Git 基本概念与诞生背景
什么是 Git?
Git 是一款分布式版本控制系统(Distributed Version Control System),核心作用是管理代码 / 文档的修改历史,支持多人协同开发,能高效追踪版本变化、回溯历史版本、解决代码冲突。
- 核心优势:速度快、分布式架构、分支功能强大、数据安全性高(通过 SHA-1 哈希算法唯一标识版本)。
Git 的诞生背景
在 Git 出现前,主流版本控制系统是 SVN(Subversion)、CVS 等集中式系统—— 依赖中央服务器存储所有版本历史,开发者需联网从服务器下载 / 上传代码,网络差时操作效率极低。
2005 年,Linux 内核开发团队因商业纠纷失去 BitKeeper(当时使用的分布式版本工具)的授权。Linux 创始人 Linus Torvalds 为解决内核代码管理问题,仅用 1 周时间独立开发出 Git,1 个月内便将 Linux 内核交由 Git 管理。此后 Git 迅速普及,成为全球最流行的版本控制工具,支撑了 GitHub(全球最大开源平台)、Gitee(华语最大开源平台)等代码托管平台的核心功能。
Git 核心原理
版本管理的本质:从 “手动备份” 到 “快照式追踪”
手动管理版本(如命名 文档_20240101.txt、文档_最新修改.txt)的问题:
- 文件名无法体现修改内容;
- 重复存储完整文件,浪费空间;
- 多人协作时版本混乱,无法合并修改。
Git 解决思路:快照式版本管理
-
不重复存储完整文件,仅当文件修改时,保存新的 “快照”(文件完整状态);未修改文件则通过指针引用历史快照,节省空间;
-
每个版本生成唯一的 SHA-1 哈希值(40 位十六进制数),确保版本唯一可追溯;
-
版本历史以 “时间轴” 形式组织,支持随时回溯到任意历史版本(类似 “时光穿梭”)。

Git 的三大核心区域
Git 本地操作依赖三个核心区域,理解它们的关系是掌握 Git 的关键:
| 区域名称 | 作用 | 操作命令关联 |
|---|---|---|
| 工作区(Working Directory) | 实际编写代码 / 文档的目录,即你能看到的本地文件夹 | 日常编辑文件 |
| 暂存区(Stage/Index) | 临时存放工作区的修改,相当于 “待提交缓冲区”,可批量选择要提交的内容 | git add 加入,git reset 移出 |
| 本地仓库(Local Repository) | 存储所有版本快照的核心区域,通过 git commit 将暂存区内容提交到此处 |
git commit 提交,git log 查看 |
数据流向:工作区修改 → git add 到暂存区 → git commit 到本地仓库。
Git 环境搭建(跨平台)
Git 支持 Windows、Mac、Linux 三大系统,以下是各系统的安装方式:
Windows 系统
- 下载安装包:访问 Git for Windows 官网,选择对应系统版本(32/64 位);
- 安装过程:默认选项即可(建议勾选 “Add Git Bash Here”,方便右键打开命令行);
- 验证安装:打开 Git Bash,输入
git --version,显示版本号即安装成功。
Mac 系统
- 方式 1(通过 Homebrew):若已安装 Homebrew,直接执行
brew install git; - 方式 2(手动下载):访问 Git 官网,下载 .dmg 安装包并安装;
- 验证安装:打开终端,输入
git --version,显示版本号即成功。
Linux 系统(以 Ubuntu 为例)
通过 apt 包管理器安装,命令如下:
# 更新软件源(可选,确保安装最新版本)
sudo apt update
# 安装 Git
sudo apt install git -y
# 验证安装:查看 Git 版本,返回版本信息即成功
git --version
初始配置(必做)
安装后需配置用户名和邮箱(用于标识提交者身份,与远程仓库关联时需匹配):
# 配置用户名(替换为你的名称,如 "Zhang San")
git config --global user.name "Your Name"
# 配置邮箱(替换为你的邮箱,如 "zhangsan@example.com")
git config --global user.email "your.email@example.com"
# 查看配置结果,确认是否生效
git config --list
-global:全局参数,表示所有 Git 仓库都使用此配置;若仅需当前仓库生效,去掉该参数。
Git 本地仓库操作
初始化本地仓库(git init)
“仓库(Repository)” 是 Git 管理版本的目录,需先初始化才能使用 Git 功能。
命令解析
- 英文含义:
init= initialize(初始化); - 作用:在指定目录创建
.git隐藏文件夹(存储 Git 核心配置、版本快照等数据),将目录变为 Git 仓库。
实操示例
# 创建项目目录(如 "my-project")并进入
mkdir my-project && cd my-project# 初始化 Git 仓库:在当前目录创建 .git 文件夹
# 语法:git init [可选目录路径],不写路径则默认当前目录
git init# 查看初始化结果:通过 tree 命令查看 .git 目录结构(需先安装 tree:sudo apt install tree)
tree . -a # -a 显示隐藏文件# 执行结果(.git 目录核心内容):
# .git/
# ├── branches # 存储分支相关配置(较少使用)
# ├── config # 仓库本地配置文件(覆盖全局 config)
# ├── HEAD # 指向当前所在分支(如 refs/heads/master)
# ├── hooks/ # 钩子脚本(如提交前代码检查、提交后通知等)
# ├── info/ # 仓库信息(如 exclude 文件,类似 .gitignore)
# ├── objects/ # 存储版本快照(哈希值命名的文件)
# └── refs/ # 存储分支、标签的引用(指向具体版本哈希)
暂存与提交(git add & git commit)

暂存修改(git add)
将工作区的修改 “暂存” 到暂存区,是提交到本地仓库的前置步骤。
命令解析
- 英文含义:
add= 添加; - 作用:将指定文件 / 目录的修改加入暂存区,标记为 “待提交” 状态。
常用用法
# 暂存单个文件(替换 <file> 为文件名,如 poem.txt)
# 示例:暂存 poem.txt
git add poem.txt # 注释:将 poem.txt 的修改从工作区添加到暂存区# 暂存多个文件(空格分隔文件名)
# 示例:暂存 poem.txt 和 readme.md
git add poem.txt readme.md# 暂存当前目录所有修改(包括新增、修改文件,不包括删除)
git add . # 注释:. 表示当前目录,常用场景:批量暂存多个修改# 暂存删除的文件(若手动删除文件,需用此命令暂存删除操作)
git add -u # 注释:-u = update,仅暂存已跟踪文件的修改/删除,不包括新增文件
提交版本(git commit)
将暂存区的所有修改 “提交” 到本地仓库,生成一个新的版本节点(带唯一 SHA-1 哈希值)。
命令解析
- 英文含义:
commit= 提交; - 核心参数:
m "提交信息"(m= message,必须填写,用于描述本次修改内容,如 “新增登录功能”); - 作用:生成版本快照,记录修改者、时间、修改内容,写入本地仓库。
实操示例
# 提交暂存区内容,附带提交信息(必须用双引号包裹)
# 示例:提交暂存区的修改,描述为“写了古诗前两句”
git commit -m "写了古诗前两句"# 执行结果(关键信息解读):
# [master (root-commit) becf665] 写了古诗前两句 # master:当前分支;becf665:版本哈希前7位;引号内:提交信息
# 1 file changed, 2 insertions(+) # 1个文件修改,新增2行内容
# create mode 100644 poem.txt # 新建文件 poem.txt,权限 100644# 跳过暂存区,直接提交已跟踪文件的修改(不推荐新手使用,易遗漏修改)
# 语法:git commit -am "提交信息"(-a = all,仅对已跟踪文件有效)
git commit -am "修改古诗第二句"
注意事项
- 提交信息必须清晰:如 “修复登录页验证码错误”,避免 “修改文件”“更新代码” 等模糊描述,方便后续回溯版本;
- 每次提交应聚焦单一功能:如 “新增用户注册接口”“修复订单支付 bug”,避免一次提交包含多个不相关修改。
查看状态与差异(git status & git diff)
查看仓库状态(git status)
随时查看工作区、暂存区的状态(如是否有未暂存的修改、未提交的暂存)。
命令解析
- 英文含义:
status= 状态; - 作用:显示当前分支、未跟踪文件、已修改但未暂存的文件、已暂存待提交的文件。
实操示例
# 查看当前仓库状态
git status# 常见结果1:工作区干净(无未暂存/未提交修改)
# On branch master # 当前分支为 master
# nothing to commit, working directory clean # 工作区干净# 常见结果2:有未暂存的修改
# On branch master
# Changes not staged for commit: # 有修改未暂存
# (use "git add <file>..." to update what will be committed) # 提示用 git add 暂存
# (use "git checkout -- <file>..." to discard changes in working directory) # 提示用 git checkout 丢弃修改
#
# modified: poem.txt # 已修改的文件:poem.txt
#
# no changes added to commit (use "git add" and/or "git commit -a") # 无暂存内容可提交
查看修改差异(git diff)
对比不同区域(工作区、暂存区、本地仓库)的文件差异,明确修改了哪些内容。

命令解析
- 英文含义:
diff= difference(差异); - 核心逻辑:通过对比文件的行内容,标记 “新增行”(+ 开头)、“删除行”(- 开头)。
常用用法
# 对比:工作区 vs 暂存区(默认用法,查看未暂存的修改)
# 示例:查看所有未暂存文件的差异
git diff
# 示例:仅查看 poem.txt 的未暂存差异
git diff poem.txt# 对比:暂存区 vs 本地仓库最新版(HEAD)(查看已暂存但未提交的修改)
# --cached:仅查看暂存区内容(cached = 缓存,即暂存区)
git diff --cached
# 示例:仅查看暂存区中 poem.txt 与 HEAD 的差异
git diff --cached poem.txt# 对比:工作区 vs 本地仓库最新版(HEAD)(查看所有未提交的修改,包括未暂存+已暂存)
git diff HEAD
# 示例:仅查看 poem.txt 与 HEAD 的差异
git diff HEAD poem.txt# 对比:两个历史版本之间的差异(替换 SHA1/SHA2 为版本哈希前7位)
# 示例:对比版本 becf665 和 cdce558 的差异
git diff becf665 cdce558
# 示例:仅对比两个版本中 poem.txt 的差异
git diff becf665 cdce558 poem.txt
结果解读
# 对比 poem.txt 的差异(示例)
diff --git a/poem.txt b/poem.txt # a:源文件(如工作区);b:目标文件(如暂存区)
index 5410c1e..a28e948 100644 # 文件索引哈希,100644 是文件权限
--- a/poem.txt # ---:源文件内容
+++ b/poem.txt # +++:目标文件内容
@@ -1,2 +1,4 @@ # 差异范围:源文件1-2行,目标文件1-4行一去二三里
-茅舍四五家 # -:源文件删除的行
+烟村四五家 # +:目标文件新增的行
+亭台六七座
+八九十枝花
回溯与恢复版本(git log & git reset & git reflog)
查看版本历史(git log)
查看本地仓库的所有提交记录,包括版本哈希、提交者、时间、提交信息。
命令解析
- 英文含义:
log= 日志; - 常用参数:
-oneline(简化输出,仅显示版本哈希前 7 位 + 提交信息)、-graph(图形化显示分支合并历史)。
实操示例
# 查看完整版本历史(按时间倒序,最新版本在前)
git log# 简化输出(常用,一行显示一个版本)
git log --oneline# 执行结果(--oneline 示例):
# cdce558 一首漂亮的古诗 # cdce558:版本哈希前7位;后面是提交信息
# becf665 写了前两句# 图形化显示分支历史(多人协作时查看分支合并情况)
git log --graph --oneline --abbrev-commit
回溯到历史版本(git reset)
将当前分支的版本 “重置” 到指定历史版本,支持修改工作区、暂存区的内容。
命令解析
- 英文含义:
reset= 重置; - 核心参数:
-hard(硬重置)、-soft(软重置)、-mixed(默认,混合重置); - 版本标识:
HEAD^:上一个版本(^越多,回溯越远,如HEAD^^是上上个版本);HEAD~n:回溯到前 n 个版本(如HEAD~3是前 3 个版本);- 版本哈希前 7 位:直接指定版本(如
cdce558)。
三种重置模式对比
| 模式 | 作用(修改范围) | 适用场景 | 风险程度 |
|---|---|---|---|
--hard |
工作区 + 暂存区 + 本地仓库 | 彻底丢弃后续版本,回到历史版 | 高(丢失未提交修改) |
--soft |
仅本地仓库(暂存区、工作区不变) | 撤销提交,保留暂存区修改 | 低 |
--mixed |
本地仓库 + 暂存区(工作区不变) | 撤销暂存,保留工作区修改 | 中 |
实操示例
# 硬重置到上一个版本(HEAD^):彻底回到上一版,丢弃当前所有未提交修改
# 警告:--hard 会删除工作区未提交的内容,不可逆,务必确认无重要修改
git reset --hard HEAD^# 硬重置到指定版本(如 cdce558,替换为你的版本哈希)
git reset --hard cdce558# 软重置到上一个版本:仅撤销上一次提交,暂存区内容不变(可重新提交)
git reset --soft HEAD^# 混合重置到上一个版本(默认,可省略 --mixed):撤销暂存,保留工作区修改
git reset HEAD^ # 等价于 git reset --mixed HEAD^
恢复已 “丢失” 的版本(git reflog)
若用 git reset --hard 回溯后,想恢复到之前的 “最新版本”(已不在 git log 中显示),需用 git reflog 查看所有操作记录。
命令解析
- 英文含义:
reflog= reference log(引用日志); - 作用:记录本地仓库所有分支的操作历史(包括提交、重置、分支切换),即使分支被删除、版本被重置,仍能找到历史版本哈希。
实操示例
# 查看所有操作记录(包括已“丢失”的版本)
git reflog# 执行结果示例:
# becf665 HEAD@{0}: reset: moving to HEAD^ # HEAD@{0}:最近一次操作(重置到上一版)
# cdce558 HEAD@{1}: commit: 一首漂亮的古诗 # HEAD@{1}:上一次操作(提交古诗完整版)
# becf665 HEAD@{2}: commit (initial): 写了前两句 # HEAD@{2}:初始提交# 恢复到“一首漂亮的古诗”版本(哈希为 cdce558)
git reset --hard cdce558
丢弃工作区修改(git checkout -- )
若修改了工作区文件但不想保留,可丢弃修改(恢复到暂存区或本地仓库的最新状态)。
命令解析
- 英文含义:
checkout= 检出; -作用:区分 “文件” 和 “分支”,指定后续内容为文件名,避免 Git 将文件名误认为分支名(若文件名与分支名冲突,必须加-);- 注意:仅能丢弃未暂存的修改(若已
git add,需先git reset HEAD <file>移出暂存区,再执行此命令)。
实操示例
# 丢弃 poem.txt 的未暂存修改(恢复到最近一次 add 或 commit 的状态)
git checkout -- poem.txt# 丢弃当前目录所有未暂存修改(需谨慎,会丢弃所有文件的未暂存修改)
git checkout -- .
递交与撤销图示

Git 分布式与远程仓库
分布式 vs 集中式:核心差异
| 类型 | 代表工具 | 核心特点 | 优缺点 |
|---|---|---|---|
| 集中式 | SVN | 依赖中央服务器存储所有版本,本地仅存当前版 | 优点:架构简单;缺点:依赖网络、服务器故障则无法工作 |
| 分布式 | Git | 每个本地仓库都有完整版本历史,无中央依赖 | 优点:离线工作、速度快、数据安全;缺点:学习成本稍高 |
集中式
分布式Git 的远程仓库(如 Gitee、GitHub)本质是 “协作中转站”—— 用于同步多人的本地仓库,并非必须(多人可直接互相推送修改),但实际协作中需远程仓库提高效率。
常用远程仓库平台
- Gitee:国内平台,访问速度快,支持中文,适合华语团队(官网);
- GitHub:全球最大开源平台,资源丰富,适合国际协作(官网);
- GitLab:支持私有部署,适合企业内部团队(官网)。
以下以 Gitee 为例,讲解远程仓库操作。
远程仓库核心操作
步骤 1:创建 Gitee 远程仓库
- 注册 Gitee 账号:访问 Gitee 官网,完成注册并登录;
- 创建仓库:点击右上角 “+”→“新建仓库”,填写信息:
- 仓库名称:如
justForFun; - 仓库介绍:简要描述仓库用途(如 “存储古诗练习”);
- 开源 / 私有:根据需求选择(开源:所有人可见;私有:仅指定成员可见);
- 点击 “创建”,生成远程仓库 URL(如
https://gitee.com/your-username/justForFun.git)。
- 仓库名称:如
步骤 2:本地仓库关联远程仓库(git remote)
将本地仓库与 Gitee 远程仓库绑定,后续通过别名操作远程仓库(无需重复输入长 URL)。
命令解析
- 英文含义:
remote= 远程; - 常用命令:
git remote add(添加远程关联)、git remote -v(查看远程关联)、git remote remove(删除远程关联)。
实操示例
# 添加远程仓库关联:origin 是远程仓库的默认别名(可自定义,如 gitee)
# 语法:git remote add <远程别名> <远程仓库URL>
git remote add origin https://gitee.com/your-username/justForFun.git# 查看远程关联:确认是否添加成功(显示 fetch/push 地址)
git remote -v# 执行结果示例:
# origin https://gitee.com/your-username/justForFun.git (fetch) # 拉取地址
# origin https://gitee.com/your-username/justForFun.git (push) # 推送地址# 若需修改远程关联(如 URL 变更):先删除旧关联,再添加新关联
git remote remove origin # 删除旧的 origin 关联
git remote add origin https://gitee.com/your-username/new-repo.git # 添加新关联
步骤 3:推送本地代码到远程仓库(git push)
将本地仓库的版本推送到远程仓库,实现同步。
命令解析
- 英文含义:
push= 推送; - 核心参数:
u(-set-upstream,设置上游分支),首次推送时添加,后续可直接用git push。
实操示例
# 首次推送:将本地 master 分支推送到远程 origin 仓库,并设置上游分支
# 语法:git push -u <远程别名> <本地分支名>
git push -u origin master# 执行过程:会提示输入 Gitee 用户名和密码(或 Token,推荐用 Token 更安全)
# 用户名:你的 Gitee 账号(如手机号/邮箱)
# 密码:Gitee 密码(或个人访问令牌,获取方式:Gitee → 设置 → 私人令牌 → 生成令牌)# 后续推送:已设置上游分支,直接执行 git push 即可(默认推送到 origin/master)
git push# 推送指定分支:若本地分支是 dev,推送到远程 dev 分支
git push origin dev
常见问题:推送失败
- 原因 1:本地版本落后于远程(他人已推送新版本);解决:先拉取远程最新代码(
git pull origin master),解决冲突后再推送。 - 原因 2:权限不足(非仓库成员);解决:联系仓库管理员添加你为成员,赋予 “推送” 权限。
步骤 4:从远程仓库克隆代码(git clone)
若需参与他人项目,先将远程仓库 “克隆” 到本地(获取完整仓库,包括所有版本历史)。
命令解析
- 英文含义:
clone= 克隆; - 作用:从远程仓库复制完整代码和版本历史到本地,自动创建远程关联(别名 origin)。
实操示例
# 语法:git clone <远程仓库URL> [可选本地目录名]
# 示例1:克隆到当前目录,本地目录名与远程仓库名一致(justForFun)
git clone https://gitee.com/your-username/justForFun.git# 示例2:克隆到指定本地目录(如 "my-poem-project")
git clone https://gitee.com/your-username/justForFun.git my-poem-project# 克隆后:进入本地目录,直接查看版本历史或修改代码
cd justForFun
git log --oneline # 查看远程仓库的版本历史
步骤 5:拉取远程最新代码(git pull)
若远程仓库有新提交(如他人推送了修改),需拉取到本地,保持本地与远程同步。
命令解析
- 英文含义:
pull= 拉取; - 本质:
git fetch(拉取远程分支到本地) +git merge(合并到本地分支)的组合命令。
实操示例
# 拉取远程 origin 仓库的 master 分支,合并到本地当前分支
git pull origin master# 若本地当前分支已设置上游分支(如 master 关联 origin/master),直接执行
git pull# 拉取远程指定分支(如 dev),合并到本地 dev 分支
git pull origin dev
注意:拉取冲突
若本地修改与远程修改冲突(如同一文件同一行内容不同),Git 会提示 “CONFLICT”,需手动解决:
- 打开冲突文件,找到冲突标记(
<<<<<<< HEAD到>>>>>>> origin/master之间的内容);
- 修改内容为最终需要的版本,删除冲突标记;
- 执行
git add <冲突文件>暂存修改; - 执行
git commit -m "解决拉取冲突"提交合并; - 若需,执行
git push推送解决冲突后的版本。
多人协作流程(Fork + Pull Request)
若参与开源项目或非仓库成员,无法直接推送代码,需通过 “Fork + Pull Request(PR)” 流程贡献代码:
流程步骤
- Fork 仓库:在 Gitee 项目页面点击 “Fork”,将他人仓库复制到自己的 Gitee 账号下(成为自己的远程仓库);
- 克隆到本地:将自己账号下的 Fork 仓库克隆到本地(
git clone https://gitee.com/your-username/forked-repo.git); - 创建分支开发:在本地创建新分支(如
feature/login),在分支上修改代码并提交; - 推送分支到自己的远程:将本地新分支推送到自己的 Gitee 仓库(
git push origin feature/login); - 发起 Pull Request(PR):在自己的 Gitee 仓库页面,点击 “Pull Request”,选择原仓库的目标分支(如
master),提交 PR; - 代码评审与合并:原仓库管理员审核你的代码,通过后合并到原仓库;若需修改,根据反馈调整后重新推送并更新 PR。
Git 分支管理(核心功能)
Git 分支是 “并行开发” 的核心,支持在不影响主版本的前提下开发新功能、修复 Bug,是多人协作的关键。

分支的核心概念
-
默认分支:仓库初始化时自动创建
master分支(部分平台已改为main),通常作为 “稳定版本分支”,仅合并经过测试的代码; -
分支本质:一个指向版本快照的 “指针”,创建分支仅需新建指针,无需复制文件,操作极快;
-
HEAD 指针:指向当前所在的分支。

-
分支名
- 远程分支在本地的显示格式为
remotes/origin/分支名(如remotes/origin/dev),表示 “远程仓库 origin 中的 dev 分支”; - 本地分支名通常与远程分支名一致(如本地
dev对应远程origin/dev),但并非强制,通过git push origin 本地分支:远程分支可推送至不同名的远程分支(如git push origin local-dev:remote-dev)。
- 远程分支在本地的显示格式为
分支的常见使用场景
| 场景 | 分支策略 | 目的 |
|---|---|---|
| 开发新功能 | 从 master 拉取 feature/xxx 分支 |
不影响主版本,独立开发新功能 |
| 修复生产环境 Bug | 从 master 拉取 hotfix/xxx 分支 |
快速修复 Bug,不中断新功能开发 |
| 日常开发集成 | 从 master 拉取 develop 分支,再拉取功能分支 |
集中集成各功能分支,测试通过后合并到 master |
| 版本发布 | 从 master 拉取 release/v1.0 分支 |
专门用于版本发布前的测试和准备 |
分支核心命令(git branch & git checkout)
查看与创建分支(git branch)
# 查看所有本地分支:* 标记当前分支
git branch# 查看仅远程分支:-r = remote(远程)
git branch -r# 查看所有分支(本地 + 远程):-a = all(全部)
git branch -a# 创建新分支(如 dev):仅创建,不切换
# 语法:git branch <新分支名>
git branch dev# 删除分支(需先切换到其他分支):-d = delete(删除,仅删除已合并的分支)
git branch -d dev# 强制删除分支(未合并的分支,谨慎使用):-D = 强制删除
git branch -D dev# 重命名分支(当前在该分支时):
git branch -m old-branch-name new-branch-name
切换分支(git checkout /git switch)
- Git 2.23+ 推荐用
git switch(更直观),旧版本用git checkout。
# 方式 1:用 git checkout 切换分支
# 语法:git checkout <目标分支名>
git checkout dev# 方式 2:用 git switch 切换分支(推荐,更清晰)
git switch dev# 方式 3:创建并切换分支(常用,等价于 git branch dev + git switch dev)
# git checkout 写法:
git checkout -b dev
# git switch 写法(--create 可简写为 -c):
git switch -c dev
注意:切换分支前的准备
- 若工作区 / 暂存区有未提交的修改,切换分支可能失败(避免修改污染其他分支);
- 解决方式:
- 提交修改(
git add + git commit); - 暂存修改(
git stash,临时保存,切换后可恢复); - 丢弃修改(
git checkout -- .,谨慎使用)。
- 提交修改(
分支融合(git merge)
将一个分支的修改合并到当前分支(如将 dev 分支的功能合并到 master 分支)。
快速合并(Fast-forward)
当 master 分支在创建 dev 后无修改时,合并会采用 “快进模式”—— 直接将 master 指针指向 dev 的最新版本,无合并提交。
实操示例
# 切换到 master 分支(目标合并分支)
git switch master# 合并 dev 分支到当前 master 分支
git merge dev# 执行结果(快速合并):
# Updating 21dbcb1..89c06e0
# Fast-forward
# git.txt | 1 +
# 1 file changed, 1 insertion(+)
三方合并(Non-Fast-forward)
当 master 分支在创建 dev 后有新修改时,Git 会创建一个 “合并提交”,整合两个分支的修改(保留分支历史)。
推荐用法:禁用快进合并
为保留分支历史(方便回溯),推荐合并时禁用快进模式(--no-ff):
# 合并 dev 分支到 master,禁用快进,强制创建合并提交
git merge --no-ff -m "合并 dev 分支的新功能" dev
# -m "...":为合并提交添加描述(必须,因合并会生成新提交)
解决分支冲突
当两个分支修改了同一文件的同一部分(如 master 改了第 6 行为 “Git is hard”,dev 改了第 6 行为 “Git is easy”),合并会触发冲突。
冲突解决步骤
-
触发冲突:执行
git merge dev后,Git 提示冲突:Auto-merging git.txt CONFLICT (content): Merge conflict in git.txt Automatic merge failed; fix conflicts and then commit the result. -
查看冲突文件:打开冲突文件(如
git.txt),冲突部分会被标记:1Git is a free and open source 2distributed version control system 3designed to handle everything 4from small to very large projects 5with speed and efficiency 6<<<<<<< HEAD # 当前分支(master)的内容 7Git is hard to learn 8======= # 分隔线:上方是当前分支,下方是待合并分支(dev) 9Git is easy to learn 10>>>>>>> dev # 待合并分支(dev)的内容 -
手动修改冲突:删除冲突标记,修改为最终需要的内容(如 “Git is easy to learn with practice”):
1Git is a free and open source 2distributed version control system 3designed to handle everything 4from small to very large projects 5with speed and efficiency 6Git is easy to learn with practice -
完成合并:暂存修改并提交合并结果:
# 暂存解决冲突后的文件 git add git.txt # 提交合并(无需 -m,Git 会自动生成合并提交信息,可直接保存) git commit -
验证合并:查看日志,确认合并成功:
git log --graph --oneline # 图形化显示合并历史
暂存分支修改(git stash)
若在分支 A 上开发到一半,需切换到分支 B 处理紧急问题,但不想提交分支 A 的未完成修改,可用 git stash 临时保存修改。
命令解析
- 英文含义:
stash= 隐藏、暂存; - 作用:将工作区 / 暂存区的未提交修改保存到 “暂存栈”,工作区恢复干净状态,方便切换分支。
实操示例
# 暂存当前分支的未提交修改(添加描述,方便后续识别,推荐用法)
git stash push -m "暂存分支 A 的登录功能开发"
# 或简写(不添加描述时)
git stash# 查看暂存栈(所有暂存的修改)
git stash list# 执行结果示例:
# stash@{0}: On branch-A: 暂存分支 A 的登录功能开发 # stash@{0}:最近一次暂存# 恢复暂存的修改(两种方式)
# 方式 1:恢复最近一次暂存,并保留暂存记录(推荐,避免误删)
git stash apply stash@{0} # 可省略 stash@{0},默认恢复最近一次
# 方式 2:恢复最近一次暂存,并删除暂存记录(确认无需再次恢复时用)
git stash pop# 删除暂存记录(无需保留时)
# 删除最近一次暂存
git stash drop stash@{0}
# 删除所有暂存记录
git stash clear
Git 常用命令总结表
| 命令 | 英文含义 | 核心作用 | 常用参数 / 示例 |
|---|---|---|---|
git init |
Initialize | 初始化 Git 仓库 | git init my-project |
git add |
Add | 将工作区修改添加到暂存区 | git add file.txt、git add . |
git commit -m "msg" |
Commit | 将暂存区内容提交到本地仓库 | git commit -m "新增登录功能" |
git status |
Status | 查看工作区 / 暂存区状态 | git status |
git diff |
Difference | 查看文件差异(工作区 / 暂存区 / 仓库) | git diff、git diff --cached |
git log |
Log | 查看版本历史 | git log --oneline、git log --graph |
git reset --hard |
Reset | 回溯到历史版本(硬重置) | git reset --hard HEAD^、git reset --hard 123abc |
git reflog |
Reference Log | 查看所有操作记录(恢复丢失版本) | git reflog |
git checkout -- file |
Checkout | 丢弃工作区未暂存修改 | git checkout -- poem.txt |
git remote add |
Remote | 关联远程仓库 | git remote add origin <url> |
git push |
Push | 推送本地分支到远程仓库 | git push -u origin master |
git clone |
Clone | 克隆远程仓库到本地 | git clone <url> |
git pull |
Pull | 拉取远程分支并合并到本地 | git pull origin master |
git branch |
Branch | 查看 / 创建 / 删除分支 | git branch dev、git branch -d dev |
git switch |
Switch | 切换分支(Git 2.23+) | git switch dev、git switch -c dev |
git merge |
Merge | 合并分支到当前分支 | git merge --no-ff -m "合并 dev" dev |
git stash |
Stash | 暂存未提交修改 | git stash save "暂存修改"、git stash pop |
常见错误与注意事项
- 错误:
git push提示 “fatal: No configured push destination”原因:本地仓库未关联远程仓库;解决:执行git remote add origin <远程URL>关联远程仓库,再推送。 - 错误:
git merge提示 “CONFLICT”原因:两个分支修改了同一文件的同一部分,冲突;解决:按 “分支冲突解决步骤” 手动修改冲突文件,再提交。 - 注意:
git reset --hard风险-hard会删除工作区未提交的修改,且不可逆;执行前务必确认无重要未提交内容,或先用git stash暂存。 - 注意:提交信息规范提交信息应清晰描述修改内容,推荐格式:
类型:描述(如feat:新增用户注册接口、fix:修复登录验证码错误),方便团队协作和版本回溯。 - 注意:
.gitignore文件若需忽略某些文件(如日志、编译产物、IDE 配置文件),在仓库根目录创建.gitignore文件,写入需忽略的文件名 / 目录(如log/、.exe、.idea/),Git 会自动忽略这些文件的修改。