项目构建优化:git

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 位十六进制数),确保版本唯一可追溯;

  • 版本历史以 “时间轴” 形式组织,支持随时回溯到任意历史版本(类似 “时光穿梭”)。

    image

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)

image

暂存修改(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)

对比不同区域(工作区、暂存区、本地仓库)的文件差异,明确修改了哪些内容。

image

命令解析

  • 英文含义: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 -- .

递交与撤销图示

image

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 之间的内容);
  1. 修改内容为最终需要的版本,删除冲突标记;
  2. 执行 git add <冲突文件> 暂存修改;
  3. 执行 git commit -m "解决拉取冲突" 提交合并;
  4. 若需,执行 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,是多人协作的关键。

image

分支的核心概念

  • 默认分支:仓库初始化时自动创建 master 分支(部分平台已改为 main),通常作为 “稳定版本分支”,仅合并经过测试的代码;

  • 分支本质:一个指向版本快照的 “指针”,创建分支仅需新建指针,无需复制文件,操作极快;

  • HEAD 指针:指向当前所在的分支。

    image

  • 分支名

    • 远程分支在本地的显示格式为 remotes/origin/分支名(如 remotes/origin/dev),表示 “远程仓库 origin 中的 dev 分支”;
    • 本地分支名通常与远程分支名一致(如本地 dev 对应远程 origin/dev),但并非强制,通过 git push origin 本地分支:远程分支 可推送至不同名的远程分支(如 git push origin local-dev:remote-dev)。

分支的常见使用场景

场景分支策略目的
开发新功能master 拉取 feature/xxx 分支不影响主版本,独立开发新功能
修复生产环境 Bugmaster 拉取 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

注意:切换分支前的准备

  • 若工作区 / 暂存区有未提交的修改,切换分支可能失败(避免修改污染其他分支);
  • 解决方式:
    1. 提交修改(git add + git commit);
    2. 暂存修改(git stash,临时保存,切换后可恢复);
    3. 丢弃修改(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 initInitialize初始化 Git 仓库git init my-project
git addAdd将工作区修改添加到暂存区git add file.txtgit add .
git commit -m "msg"Commit将暂存区内容提交到本地仓库git commit -m "新增登录功能"
git statusStatus查看工作区 / 暂存区状态git status
git diffDifference查看文件差异(工作区 / 暂存区 / 仓库)git diffgit diff --cached
git logLog查看版本历史git log --onelinegit log --graph
git reset --hardReset回溯到历史版本(硬重置)git reset --hard HEAD^git reset --hard 123abc
git reflogReference Log查看所有操作记录(恢复丢失版本)git reflog
git checkout -- fileCheckout丢弃工作区未暂存修改git checkout -- poem.txt
git remote addRemote关联远程仓库git remote add origin <url>
git pushPush推送本地分支到远程仓库git push -u origin master
git cloneClone克隆远程仓库到本地git clone <url>
git pullPull拉取远程分支并合并到本地git pull origin master
git branchBranch查看 / 创建 / 删除分支git branch devgit branch -d dev
git switchSwitch切换分支(Git 2.23+)git switch devgit switch -c dev
git mergeMerge合并分支到当前分支git merge --no-ff -m "合并 dev" dev
git stashStash暂存未提交修改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 会自动忽略这些文件的修改。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值