git:指令集
以下是对这些 Git 新特性和命令的更详细解读和实际用例分析,帮助更好地理解它们的作用及适用场景:
1. git switch
和 git restore
背景:
- 传统上,
git checkout
是一个多功能命令,用于切换分支、检出文件、创建分支等,但其用途过于复杂,容易导致混淆。
新命令:
-
git switch
:专注于切换分支。- 用法:
git switch branch-name # 切换到指定分支 git switch -c new-branch-name # 创建并切换到新分支
- 优点:避免因误用
git checkout
导致的文件检出错误。
- 用法:
-
git restore
:专注于还原文件的修改。- 用法:
git restore file.txt # 恢复工作目录中的指定文件 git restore --staged file.txt # 从暂存区移除文件的更改
- 优点:明确分工,降低误操作的风险。
- 用法:
2. git worktree
背景:
- 需要在一个仓库中同时处理多个分支时,频繁切换分支效率低,且可能导致未提交修改的丢失。
功能:
- 允许在同一仓库中创建多个工作目录,每个目录可以检出不同的分支或提交。
用法:
git worktree add ../path-to-new-worktree branch-name # 创建新工作目录并检出分支
git worktree list # 列出所有工作目录
git worktree remove ../path-to-new-worktree # 删除指定的工作目录
场景:
- 同时开发多个功能或修复多个问题,避免频繁切换分支或克隆多个仓库。
3. git sparse-checkout
背景:
- 在处理大型代码仓库时,检出所有文件可能导致资源浪费或加载缓慢。
功能:
- 支持稀疏检出,仅检出特定的文件或目录。
用法:
git sparse-checkout init # 初始化稀疏检出模式
git sparse-checkout set path/to/folder # 设置稀疏检出的目录
git sparse-checkout add another/folder # 添加更多目录到稀疏检出范围
场景:
- 大型单体仓库(monorepo)开发中,仅需特定模块代码时。
4. git range-diff
背景:
- 在变基或合并多个提交后,理解提交的差异和变化会变得复杂。
功能:
- 对比两个提交范围的差异,帮助理解提交在变基或历史改写后的具体变化。
用法:
git range-diff upstream..HEAD feature-branch # 比较两个范围的差异
场景:
- 代码审查过程中,分析变基后提交历史的变化。
5. git maintenance
背景:
- 长期使用的仓库可能会出现性能问题,需要定期维护。
功能:
- 提供自动化的维护任务,如压缩对象、优化文件等。
用法:
git maintenance run # 立即运行维护任务
git maintenance start # 启用后台维护
git maintenance stop # 停止后台维护
场景:
- 在持续集成环境中,保持仓库高效性能。
6. git log --remerge-diff
背景:
- 在调试复杂的合并历史时,需要了解某次合并引入的确切更改。
功能:
- 重建合并提交,显示其引入的差异。
用法:
git log --remerge-diff
场景:
- 代码审查中,详细分析复杂合并带来的具体更改。
这些新命令和特性各自解决了开发流程中的实际痛点,大幅提升了 Git 的易用性和效率。在日常使用中,以下是常见组合:
- 使用
git switch
和git restore
替代git checkout
。 - 在大型项目中,结合
git worktree
和git sparse-checkout
提高开发效率。 - 使用
git maintenance
和git log --remerge-diff
优化仓库性能和代码审查。
是 Git 的核心操作,用于处理分支切换、回退、更改历史记录以及查看操作记录等功能。以下是它们的作用和具体使用场景:
7. git checkout
(切换分支或检出文件)
场景 1:切换分支
# 切换到现有分支 "feature-branch"
git checkout feature-branch
场景 2:创建并切换到新分支
# 创建新分支 "new-feature" 并切换到该分支
git checkout -b new-feature
场景 3:恢复文件
# 恢复文件 "app.js" 到上一次提交的状态
git checkout HEAD app.js# 从其他分支检出某个文件
git checkout dev -- app.js
注意:
git checkout
功能繁多,可能导致误用,因此从 Git 2.23 开始,切换分支和检出文件的功能被拆分为git switch
和git restore
。
8. git reset
(回退到指定提交)
作用:
- 主要用于撤销提交或重置文件的状态。
三种模式:
-
--soft
:保留工作区和暂存区的更改,仅回退提交记录。git reset --soft HEAD~1 # 回退到上一个提交
-
--mixed
(默认):保留工作区的更改,但清空暂存区。git reset HEAD~1
-
--hard
:彻底回退,包括清空工作区的更改,无法恢复!git reset --hard HEAD~1
常用操作:
- 回退到指定提交:
git reset --hard commit-hash**仅从暂存区移除文件** git reset file.txt
注意:
reset
会修改提交历史,可能导致数据丢失,不适合已推送的分支。
9. git revert
(撤销特定提交)
作用:
- 创建一个新的提交来反向应用某次提交的更改。
与 reset
的区别:
revert
是安全操作,不会修改提交历史,适合已推送的分支。
用法:
-
撤销指定提交:
git revert commit-hash
-
批量撤销多个提交:
git revert commitA..commitB
-
自动跳过冲突提示:
git revert commit-hash --no-edit
场景:
- 修复已推送的错误提交。
- 撤销特定功能或 Bug 修复。
10. git reflog
(查看历史操作记录)
场景 1:查看所有操作记录
git reflog
- 输出示例:
abc1234 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~1 def5678 HEAD@{1}: commit: Fix a bug ghi9012 HEAD@{2}: checkout: moving from feature to main
场景 2:恢复误删分支
# 假设分支被删除,找到分支最后一次操作的 commit-hash
git reflog# 创建分支恢复到误删位置
git branch recovered-branch abc1234
场景 3:恢复误用 reset --hard
丢失的提交
# 找到丢失的提交的 commit-hash
git reflog# 回退到该提交
git reset --hard commit-hash
完整操作案例
案例 1:修复提交历史
- 假设你误提交了错误内容:
git commit -m "Wrong changes"
- 使用
reset
回退到暂存区:git reset HEAD~1
- 修改文件后重新提交:
git add file.txt git commit -m "Correct changes"
案例 2:撤销错误的合并
- 假设最近一次合并出现问题:
git merge feature-branch
- 使用
revert
撤销合并:git revert -m 1 commit-hash
案例 3:恢复误删的分支
- 假设你意外删除了分支:
git branch -d feature-branch
- 查找分支的最后一次操作记录:
git reflog
- 恢复分支:
git branch feature-branch commit-hash
案例 4:稀里糊涂丢了提交,如何恢复
- 假设你执行了以下命令丢失了更改:
git reset --hard HEAD~2
- 查找丢失的提交:
git reflog
- 恢复到丢失的提交:
git reset --hard commit-hash
命令 | 适用场景 |
---|---|
checkout | 切换分支、恢复文件、查看特定提交的文件内容。 |
reset | 回退到某个提交,修改提交历史(慎用在已推送分支)。 |
revert | 撤销特定提交的更改,生成新的提交(安全撤销)。 |
reflog | 查看本地分支的所有操作记录,恢复被误删除或回退的提交。 |
HEAD
的作用
HEAD
是 Git 中的一个特殊的指针,它始终指向当前活动分支的最新提交。可以理解为 Git 用来追踪“当前工作位置”的标记。通过操作 HEAD
,我们可以切换分支、回退提交、检出历史版本等。
HEAD
的主要特性
-
指向当前分支的最新提交:
- 在分支上工作时,
HEAD
通常指向该分支的名称,例如main
、dev
等。 - 例如:
HEAD -> main
- 这表示当前
HEAD
绑定到main
分支,而main
分支指向它的最新提交。
- 在分支上工作时,
-
可临时指向特定提交:
- 如果使用
git checkout
检出一个历史提交,HEAD
会处于“分离状态”(detached HEAD),直接指向该提交的哈希值,而不再绑定到某个分支。
- 如果使用
HEAD
的作用和常见场景
1. 检出分支
- 当切换到某个分支时,
HEAD
更新为指向该分支的最新提交。
git checkout main
- 此时,
HEAD -> main
,表示当前工作目录的内容基于main
分支。
2. 回退提交
- 使用
git reset
时,HEAD
可以移动到历史的某个提交。
git reset --hard HEAD~1
- 此操作将
HEAD
指针向回移动一位,同时更新当前分支。
3. 查看历史提交
- 通过
HEAD
指向的提交哈希值,可以检出历史版本。
git checkout HEAD~2 # 检出当前分支的前两次提交
- 此时,
HEAD
处于分离状态。
4. 分离 HEAD
状态(Detached HEAD)
- 如果
HEAD
不再指向分支,而是直接指向某个提交哈希值,就进入了分离状态:
git checkout commit-hash
- 此时的
HEAD
:HEAD detached at commit-hash
- 分离状态常用于查看历史版本或基于某次提交新建分支。
5. 临时恢复文件
- 使用
HEAD
恢复工作区文件到最新提交状态:
git checkout HEAD -- file.txt
- 该命令会将
file.txt
恢复到当前提交时的状态。
6. 参考点操作
HEAD
作为当前分支的参考点,可用于多种操作:
命令 | 描述 |
---|---|
HEAD~1 | 当前提交的父提交。 |
HEAD~2 | 当前提交的祖父提交。 |
HEAD^ | 当前提交的第一个父提交(等价于 HEAD~1 )。 |
HEAD^2 | 当前提交的第二个父提交(用于合并提交)。 |
HEAD@{n} | 当前分支的 reflog 中第 n 次变更位置。 |
HEAD
的常见使用示例
场景 1:快速回到最新提交
- 如果你临时查看了历史提交,想返回最新的提交:
git checkout main
场景 2:撤销最近一次提交,但保留工作区更改
git reset HEAD~1
场景 3:回退到分支的某个历史状态
git reset --hard HEAD~3
场景 4:对比当前工作区和最新提交的差异
git diff HEAD
场景 5:恢复文件到上次提交的状态
git checkout HEAD -- file.txt
场景 6:创建分支基于特定提交
- 假设当前
HEAD
在分离状态,想基于它创建新分支:
git checkout -b new-branch
注意事项
-
分离状态的风险:
- 在分离状态中,如果你没有创建新分支,做的所有提交都可能丢失。
- 建议在需要继续工作的场景下,创建新分支:
git checkout -b temp-branch
-
与
HEAD
相关的误操作:- 使用
git reset --hard
修改HEAD
时,要谨慎操作,避免丢失工作区的更改。
- 使用
什么是分离状态(Detached HEAD)?
通常情况下,HEAD
是指向一个分支的,比如 main
或 feature-branch
。当你在某个分支上工作时,HEAD
会跟踪该分支的最新提交。
但是,当你检出(checkout)一个具体的提交哈希值,而不是分支名时,HEAD
就直接指向该提交,而不是分支。这就是所谓的“分离状态”。
为什么叫分离状态?
在分离状态下:
HEAD
不再跟踪任何分支,而是直接指向某个具体的提交。- 你可以查看或修改代码,但这些更改不会被关联到任何分支上,除非你创建一个新的分支。
如何进入分离状态?
分离状态通常发生在以下情况下:
1. 检出一个具体的提交
git checkout commit-hash
- 这会让
HEAD
指向指定的提交,而不是当前分支的最新提交。
2. 检出一个标签(Tag)
git checkout v1.0.0
- 标签通常指向一个具体的提交,检出标签也会导致
HEAD
分离。
3. 检出远程分支未合并的提交
git checkout origin/feature-branch
- 如果本地没有该分支,直接检出远程分支的提交也会导致分离状态。
分离状态下会发生什么?
-
查看代码是安全的:
- 你可以安全地查看指定提交的代码,不会对其他分支造成影响。
-
提交的更改可能丢失:
- 如果你在分离状态下修改代码并提交:
这些更改不会自动关联到任何分支,可能导致提交变得“孤立”。git commit -m "Work in detached HEAD"
- 如果你在分离状态下修改代码并提交:
-
你需要创建新分支保存工作:
- 如果不想丢失提交,需要创建一个新分支:
git checkout -b new-branch
- 如果不想丢失提交,需要创建一个新分支:
分离状态的工作流程
例子:检出历史提交
假设当前分支是 main
,它的提交历史如下:
A -> B -> C -> D (HEAD, main)
你运行以下命令:
git checkout B
此时:
HEAD
会直接指向提交B
。main
分支仍然指向提交D
。- 工作区的代码被恢复为提交
B
的状态。
结果:
A -> B (HEAD) -> C -> D (main)
如果你在这个状态下修改文件并提交:
git commit -m "New commit"
提交历史会变成这样:
A -> B -> E (HEAD) -> C -> D (main)
注意: 提交 E
不属于任何分支,是孤立的。
解决孤立提交:
-
如果你想保留提交
E
,需要创建一个新分支:git checkout -b temp-branch
新分支
temp-branch
会指向提交E
,保留你的工作。 -
如果你直接切换到其他分支而没有保存,提交
E
会被垃圾回收机制清理掉。
如何离开分离状态?
如果你不打算保留分离状态下的任何修改,可以直接切换回分支:
git checkout main
分离状态的注意事项
-
分离状态适合以下场景:
- 检查代码在特定历史版本中的状态。
- 调试某个历史提交。
- 基于某个历史提交开始新的开发。
-
不适合长期工作:
- 因为分离状态的更改不被分支记录,很容易导致工作丢失。
总结
当你在分离状态下,HEAD
不再绑定到某个分支,而是直接指向某个提交。虽然你可以修改和提交代码,但这些提交是孤立的,必须创建新分支来保存。分离状态通常用于查看或临时操作历史版本,但需要注意保存工作,以免丢失更改。
相关文章:
git:指令集
以下是对这些 Git 新特性和命令的更详细解读和实际用例分析,帮助更好地理解它们的作用及适用场景: 1. git switch 和 git restore 背景: 传统上,git checkout 是一个多功能命令,用于切换分支、检出文件、创建分支等&…...
自闭症家庭:建立支持系统与平衡生活
在自闭症家庭的世界里,每一天都充满了挑战与希望。自闭症,这一复杂的神经发育障碍,不仅影响着孩子的成长轨迹,也对整个家庭的生活方式产生了深远的影响。面对这一挑战,许多家庭都在努力寻找有效的支持系统和平衡生活的…...

html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)
htmlcssjs网页设计 美食 美食天下2个页面(里面包含php和mysql) 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…...
高阶知识库搭建实战七、(知识库雏形开发:qianwen-plus+Faiss)(练习推荐)
构建知识库:结合Faiss和qianwen-plus大模型的实践 环境搭建参考前面几篇文章:基础环境搭建、Faiss向量数据库安装 在当今信息爆炸的时代,如何高效地管理和检索海量知识成为了一个重要课题。知识库的构建为我们提供了一种有效的解决方案,它能够将分散的信息整合起来,方便…...

麒麟服务器安装kafka--亲测
我这安装的是单机版本的: 下载地址:Index of /kafka/3.9.0 我下载的是:https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…...

微机——8086微处理器的数据传送指令
目录 数据传送指令: 通用数据传送指令: MOV指令: 堆栈操作指令: PUSH指令: POP指令: 交换指令XCHG: XCHG指令: 换码指令XLAT: 换码指令XLAT: 8086 …...
vue3中onUpdated钩子函数和nextTick的具体使用场景和区别
在 Vue 3 中,onUpdated 钩子函数和 nextTick 方法都用于处理 DOM更新后的操作,但它们的使用场景和触发时机有所不同。以下是它们的具体使用场景和区别,结合代码示例进行解释: onUpdated 钩子函数 使用场景:适用于需要…...

colnames看似简单,却能优化数据处理流程
引言 在数据处理和分析中,变量名称是至关重要的,它们决定了数据的可读性和操作的简便性。在R语言中,colnames 函数以其简单的语法设计,提供了高效管理数据框列名的能力,尤其是在复杂的爬虫任务中显得尤为重要。本篇文…...
欧几里得距离在权重矩阵中的物理意义
欧几里得距离在权重矩阵中的物理意义 目录 欧几里得距离在权重矩阵中的物理意义**衡量神经元差异程度**:**反映模型变化程度**:**聚类和分组的依据**:自然语言处理中的模型更新:**神经网络聚类分组**:欧几里得距离在权重矩阵中的物理意义衡量神经元差异程度: 在神经网络中…...

AI编程辅助开发网站
咋用AI工具快速鼓捣出个网站? 咱都知道,现在这年月,干啥都讲究个效率,做网站更是如此。好在有了那些AI小帮手,不管你是专业搞开发的老手,想让活儿干得更快些,还是从没做过网站的小白࿰…...

「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。 关键词 打卡提醒状态管理定时任务输入校验UI交互 一、功能说明 打卡提醒小应用包含以下功能: 提醒时间输入与…...

基于单片机洗衣机控制器的设计(论文+源码)
1需求分析 在智能洗衣机系统设计中,考虑到洗衣机在实际应用过程中,需要满足用户对于不同衣物清洁、消毒的应用要求,对设计功能进行分析,具体如下: 通过按键实现洗衣机不同工作模式的切换,包括标准模式&…...

【Git系列】解析与解决Git错误:RPC失败;curl 56 OpenSSL SSL_read: error:140943FC
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
[Unity Shader] 【游戏开发】Unity基础光照1-光照模型原理
在计算机图形学中,渲染是一个复杂的过程,包含了两个主要部分:决定一个像素的可见性和计算该像素的光照。其中,光照模型是渲染过程中的核心部分,它模拟了真实世界中的光与物体表面的交互,帮助生成最终的图像。在Unity等游戏引擎中,理解光照模型的原理是创建真实感视觉效果…...

基于Python 的宠物管理系统(源码+部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
console.log封装
console.log封装 在控制台中打印带有颜色和格式的日志信息。 /*** 检查给定的对象是否为数组*/ const isArray function (obj: any): boolean {return Object.prototype.toString.call(obj) [object Array] }/*** Logger 构造函数*/ Logger () > {}/*** 根据日志类型返回…...

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,它负责初始化和测试系统硬件组件,并加载启动操作系统。在某些情况下,如调整启动顺序、更改系统时间或日期、修改硬件配置等,您可能需要进入BIOS进…...

GitLab创建用户,设置访问SSH Key
继上一篇 Linux Red Hat 7.9 Server安装GitLab-CSDN博客 安装好gitlab,启用管理员root账号后,开始创建用户账户 1、创建用户账户 进入管理后台页面 点击 New User 输入用户名、邮箱等必填信息和登录密码 密码最小的8位,不然会不通过 拉到…...

Mysql--基础篇--SQL(DDL,DML,窗口函数,CET,视图,存储过程,触发器等)
SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的标准语言。它允许用户定义、查询、更新和管理数据库中的数据。SQL是一种声明性语言,用户只需要指定想要执行的操作,而不需要详细说明如何…...
比较 FreeSWITCH 的 asr 事件和回调函数
用 lua 来描述,是这样的 第一种做法: session:setVariable("fire_asr_events", "true") session:execute("detect_speech", "start-input-timers") 识别到结果之后可以收到 DETECTED_SPEECH 事件 另外一个做法…...

AWSLambda之设置时区
目标 希望Lambda运行的时区是东八区。 解决 只需要设置lambda的环境变量TZ为东八区时区即可,即Asia/Shanghai。 参考 使用 Lambda 环境变量...
在Android13上添加系统服务的好用例子
在Android13上添加一个自动的system service例子 留好,备用。 --- .../prebuilts/api/30.0/plat_pub_versioned.cil | 76 - .../prebuilts/api/31.0/plat_pub_versioned.cil | 94 - .../prebuilts/api/32.0/plat_pub_versioned.cil | 94 - frameworks/base/co…...

01-VMware16虚拟机详细安装
官网地址:https://www.vmware.com/cn.html 1.1 打开下载好的 .exe 文件, 双击安装。 1.2 点击下一步 1.3 先勾选我接受许可协议中的条款,然后点击下一步 1.4 自定义安装路径,注意这里的文件路径尽量不要包含中文,完成…...

Selenium自动化测试工具安装和使用(PyCharm)
一,了解驱动 手工测试我们很了解,假设我要测试百度首页是否正常,只需要鼠标点击打开浏览器,然后输入百度网址即可 但是对于程序来说,打开浏览器,需要用到对应的驱动,就好比你给电脑装了个外置…...
添加按钮跳转页面并且根据网站的用户状态判断是否显示按钮
现在我们需要的是为页面添加一个按钮,这个按钮是动态的,需要根据网站用户登录过后是否是vip来判断是否显示,然后按钮的效果是跳转到某个页面。 首先我们需要在页面中找到我们需要添加按钮的位置,找到对应的文件,然后比…...
18-Oracle 23ai JSON二元性颠覆传统
在当今百花齐放的多模型数据库时代,开发人员常在关系型与文档型数据库间艰难取舍。Oracle Database 23ai推出的JSON关系二元性(JSON Relational Duality) 和二元性视图(Duality Views) 创新性地统一了两者优势…...

408第一季 - 数据结构 - 栈与队列
栈 闲聊 栈是一个线性表 栈的特点是后进先出 然后是一个公式 比如123要入栈,一共有5种排列组合的出栈 栈的数组实现 这里有两种情况,,一个是有下标为-1的,一个没有 代码不用看,真题不会考 栈的链式存储结构 L ->…...
Qt Quick Test模块功能及架构
Qt Quick Test 是专门为测试 QML 应用程序设计的模块,在 Qt 6.0 中得到了显著增强。 一、主要功能/使用方法 核心功能概述 QML 单元测试框架 提供完整的 QML 测试环境 支持测试用例组织和执行 包含 QML 断言函数和测试结果收集 测试类型支持 组件功能测试 用…...
【生活】程序员防猝si指南
note 一、定期体检二、均衡饮食,多食用对心脏有保护作用的食物三、每周运动四、减压五、保证睡眠六、戒烟限酒7、控制血压8、警惕流感攻击心脏9、关注牙齿健康10、不要抵触吃药 文章目录 note一、定期体检二、均衡饮食,多食用对心脏有保护作用的食物三、…...
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
在使用PHP连接MySQL数据库时,可能会遇到连接失败和写锁问题。这类问题可能会影响应用的正常运行,本文将详细介绍排查和解决这些问题的方法。 一、PHP连接MySQL数据库失败 1. 排查连接失败的常见原因 数据库配置错误: 检查数据库主机、用户名…...