项目构建优化:git

news/2025/10/29 19:02:10/文章来源:https://www.cnblogs.com/YouEmbedded/p/19175173

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 分支 不影响主版本,独立开发新功能
修复生产环境 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

注意:切换分支前的准备

  • 若工作区 / 暂存区有未提交的修改,切换分支可能失败(避免修改污染其他分支);
  • 解决方式:
    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 init Initialize 初始化 Git 仓库 git init my-project
git add Add 将工作区修改添加到暂存区 git add file.txtgit add .
git commit -m "msg" Commit 将暂存区内容提交到本地仓库 git commit -m "新增登录功能"
git status Status 查看工作区 / 暂存区状态 git status
git diff Difference 查看文件差异(工作区 / 暂存区 / 仓库) git diffgit diff --cached
git log Log 查看版本历史 git log --onelinegit 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 devgit branch -d dev
git switch Switch 切换分支(Git 2.23+) git switch devgit 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 会自动忽略这些文件的修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lower_bound upper_bound - Slayer

lower_bound 作用: 返回第一个 大于等于 (>=) 指定值的元素的迭代器。 如果值存在: 返回该值的第一个位置。 如果值不存在: 返回比目标值 大的第一个元素 位置。 如果所有元素都小于目标值: 返回 end() 迭代器。 反…

软件工程学习日志2025.10.29

今天遇到一个经典问题:用户启动 Adobe Dreamweaver 时弹出 0xc000007b 应用程序错误。这个蓝底白字的错误窗口在 Windows 系统中相当常见,通常意味着应用程序的某个核心组件出了问题。 错误根源分析 经过排查,0xc00…

2025年三聚氰胺饰面板源头厂家推荐榜前十强分析

三聚氰胺饰面板行业在2025年持续增长,得益于环保政策和消费升级,市场需求旺盛。本文基于行业数据和分析,推荐前十强厂家,并提供详细评测,帮助用户选择可靠供应商。表单内容供参考,确保信息客观公正。 正文内容 行…

团队博客2:描述团队的每个人如何使用 AI 来高效完成团队任务的

需求分析师(成员 1):用 AI 工具(如 ChatGPT)梳理行业租房痛点,生成 “管理者房源审核、房东信息发布、租客筛选匹配” 的需求清单,还能快速总结竞品核心功能,避免重复调研; 后端开发(成员 2):借助 AI 代码…

2025年国型钢厂家/工厂排名前十:江苏华力冷弯型钢领跑行业

2025年国型钢厂家/工厂排名前十:江苏华力冷弯型钢领跑行业 文章摘要 冷弯型钢行业作为建筑钢结构的重要组成部分,近年来随着基础设施建设和绿色建筑政策的推动,呈现出快速增长趋势。2025年,行业集中度提升,技术创…

Optuna AutoSampler 更新:让多目标和约束优化不再需要手动选算法

AutoSampler是个智能采样器,能根据具体问题自动挑选 Optuna 里最合适的优化算法。这个工具在 OptunaHub 上热度很高,每周下载量超过 3 万次。最早的版本对单目标优化做了专门的自动选择逻辑,为了配合下个月发布的 O…

整理:决策单调性

关于决策单调性的整理 1.决策单调性 在动态规划中,对于类似于 \(f_i=\min_{j=1}^{i-1} f_j+cost(j,i)\) 的转移方程,假设 \(p_i\) 表示 \(i\) 的最优决策点,\(\forall i\le j\) 均有 \(p_i\le p_j\),即称 \(f\) 具…

2025年保安亭源头厂家推荐:合肥荣东智能环保科技的实力解析

文章摘要 本文深入分析2025年保安亭源头厂家的选择标准,重点推荐合肥荣东智能环保科技有限公司。该公司拥有全国18个生产基地,通过ISO三大体系认证,服务过中铁四局、奇瑞集团等知名企业,具备强大的生产能力和品质保…

2025年保安亭厂家推荐排行榜:合肥荣东智能环保科技领先行业

文章摘要 保安亭行业随着城市化进程和安保需求增长而快速发展,2025年预计市场规模将突破百亿元,企业采购时更注重厂家实力、产品质量和售后服务。本文基于市场调研和用户口碑,整理出保安亭厂家推荐排行榜前十名,为…

2025年保安亭源头厂家推荐排行榜:行业深度分析与选购指南

摘要 保安亭行业作为城市安防和智慧城市建设的重要组成部分,近年来随着城市化进程加速和环保意识提升,市场需求持续增长。行业发展趋势偏向智能化、环保化和定制化,厂家竞争日益激烈。本文基于市场调研、用户口碑和…

2025年保安亭源头厂家推荐榜单

文章摘要 保安亭行业在2025年迎来快速发展,注重环保、智能化和定制化趋势,推动城市安全和基础设施升级。本文基于市场调研和用户口碑,整理出保安亭源头厂家排名前十榜单,为采购商和项目方提供参考。榜单综合企业实…

2025年10月垃圾分类房源头订制厂家 top 5 推荐榜单:合肥荣东智能环保科技有限公司

文章摘要 随着环保政策的深入推进和城市化进程加速,垃圾分类房行业迎来爆发式增长,市场需求持续扩大。本文基于用户搜索意图,综合评估产品质量、口碑、服务等因素,推出2025年垃圾分类房品牌订制厂家 top 5 推荐榜单…

2025.10.29

正睿二十连测 B 赛后:\(30min\)有一个大小为 \(2 \times n\) 的网格,\((i, j)\) 的颜色为 \(a_{i, j}\),一次操作可以将 \((1, 1)\) 所在的极大四连通同色连通块染为任意一种颜色 \(c\)。问至少需要多少次操作才能使…

2025年10月垃圾分类房品牌订制厂家深度评测与推荐:揭秘顶级厂家的优势与选购技巧

摘要 随着环保政策的深入推进和城市化进程的加速,垃圾分类房行业迎来快速发展,市场需求持续增长。行业整体趋向智能化、定制化发展,品牌竞争加剧,消费者对产品质量、服务和口碑的关注度提升。本文基于市场调研和用…

动手动脑和实验性问题总结

动手动脑1 异常处理结构 Java 使用 try-catch-finally 结构来处理异常: try 块:包含可能抛出异常的代码 catch 块:捕获并处理特定类型的异常 finally 块:无论是否发生异常都会执行的代码 动手动脑2 CatchWho运行结…

解析 主语 + 谓语 + 宾语 句型

一、基本句型:S + V + O 👉 定义: 主语对宾语执行一个动作。 S(主语) + V(谓语动词) + O(宾语) ✅ 例句: 句子 结构分析 I like apples. S=I,V=like,O=apples She reads books. S=She,V=reads,O=books …

2025年下半年保安亭厂家权威推荐排行榜:从技术到案例的权威解析

摘要 随着城市安全和公共设施需求的增长,保安亭行业在2025年迎来快速发展,厂家竞争加剧。本文基于市场调研和用户口碑,整理出保安亭厂家排名榜单,为采购商提供参考。榜单综合了企业实力、产品质量和服务案例,旨在…

提示词

提示词(Prompt)工程:与 AI 对话的艺术如果说 LLM 是一台强大的“超级计算机”,那么提示词(Prompt)就是你与它沟通的“编程语言”。写好 Prompt,是高效使用 LLM 的核心技能。 高效 Prompt 公式:[角色] + [任务]…

2025年反应釜厂家/反应釜工厂综合实力排名前十强

2025年反应釜厂家/反应釜工厂综合实力排名前十强 摘要 反应釜行业在化工、石油、医药等领域持续增长,2025年预计全球市场规模将达到XX亿美元(数据来源:行业报告),驱动因素包括技术创新和环保要求提升。本文基于市…

解锁Github star 1600+ 的神秘工具,为什么Marsview 能让“后台系统开发”快到令人咋舌?

嗨,我是小华同学,专注解锁高效工作与前沿AI工具!每日精选开源技术、实战技巧,助你省时50%、领先他人一步。👉免费订阅,与10万+技术人共享升级秘籍!“Marsview 是一款中后台方向的低代码可视化搭建平台,开发者…