`git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支

git restoregit checkout 都可以用于丢弃工作区的改动

但它们有一些区别,尤其是在 Git 2.23 引入了新的命令后。

主要区别

  1. git checkout 是一个多用途命令

    • 它用于切换分支
    • 它还可以用于恢复工作区中特定文件的更改。
    • 由于功能过于复杂,Git 社区决定简化和分离其功能。
  2. git restore 是一个更专门的命令

    • 它专门用于恢复文件丢弃工作区的改动,让操作更具可读性和直观性。
    • 它不会影响分支切换,只处理工作区和暂存区的文件恢复相关操作。

两者的用途对比

命令功能描述
git checkout <文件>丢弃文件的本地改动,并恢复到最近的提交状态(同时也用于分支切换,功能混合)。
git restore <文件>丢弃文件的本地改动,仅用于恢复文件,不涉及分支切换。
git checkout <分支>切换到某个分支,并更新工作区内容为该分支的最新提交。
git restore --source <提交> <文件>从指定的提交中恢复文件,恢复到工作区。
git restore --staged <文件>丢弃暂存区的改动(类似于 git reset HEAD <文件>),将暂存区改动恢复到工作区。

典型使用场景

  • git checkout 的典型场景

    • 切换分支:git checkout main
    • 丢弃某个文件的改动:git checkout <文件>
  • git restore 的典型场景

    • 丢弃工作区改动,恢复文件:git restore <文件>
    • 丢弃暂存区改动(取消 git add):git restore --staged <文件>
    • 从某个提交恢复文件:git restore --source=<提交哈希> <文件>

为什么引入 git restore

在 Git 2.23 之前,git checkout 的用途广泛,但这也导致命令功能复杂,不直观。为了解决这一问题,Git 开发者引入了两个新的命令来更明确地分离功能:

  1. git restore:用于恢复或丢弃文件的改动(工作区和暂存区)。
  2. git switch:用于切换分支。

通过这两个更明确的命令,Git 操作变得更清晰、易于理解。

总结

  • git checkout:可以切换分支或丢弃文件的改动,但功能较为复杂。
  • git restore:专门用于恢复文件的内容,操作更直观,推荐在恢复文件时使用。

因此,建议使用 git restore 来丢弃工作区的改动,因为它的功能更明确,语义更加清晰。

git switchgit checkout 都是 Git 中用来切换分支的命令

Git 在 2.23 版本中引入了 git switch 命令,以简化和明确分支切换的操作。下面是它们的主要区别:

1. 目的更明确

  • git checkout 是一个多用途命令,它不仅用于切换分支,还可以用于切换到某个特定的提交(commit),或者将工作区文件恢复到某个特定的状态。
  • git switch 专门设计用于切换分支,它简化了 git checkout 切换分支的操作,避免了误用和歧义。

2. git switch 更专注于分支操作

  • git checkout

    • 可以切换到一个分支,也可以切换到某个提交(没有分支)。
    • 还可以用于恢复工作区文件。
    • 由于 git checkout 有多个功能,容易导致误用。例如,当用户想切换分支时,如果输入了错误的分支名,它可能导致切换到一个孤立的 commit(非分支)。
  • git switch

    • 只用于分支切换,不会涉及其他功能(例如恢复文件)。
    • 更加直观和简单,防止用户误操作。

3. 具体的使用场景

git checkout 的常见使用方式:
git checkout <branch-name>  # 切换到分支
git checkout <commit-hash>  # 切换到某个提交的状态("分离 HEAD" 状态)
git checkout -- <file>      # 恢复工作区文件到暂存区或特定版本的状态
git switch 的常见使用方式:
git switch <branch-name>    # 切换到分支
git switch -c <new-branch>  # 创建并切换到一个新的分支

4. 创建新分支的方式

  • git checkout 创建并切换到新分支的命令:

    git checkout -b <new-branch>
    
  • git switch 创建并切换到新分支的命令:

    git switch -c <new-branch>
    

5. 分离 HEAD 状态

  • git checkout 可以切换到某个特定的提交,这样会进入“分离 HEAD”状态:

    git checkout <commit-hash>
    
  • git switch 默认情况下不会让你进入分离 HEAD 状态。如果需要进入分离 HEAD,你需要显式使用 --detach 选项:

    git switch --detach <commit-hash>
    

6. 避免误操作

由于 git checkout 的多功能性,新手在切换分支时有时可能会误切换到某个提交或者使用错误的操作方式。git switch 通过限制其功能,只专注于分支切换,减少了这种混淆。

总结

  • git checkout:多功能的命令,既可以切换分支,又可以切换到某个提交,还可以用于恢复文件。
  • git switch:专注于分支切换,更加直观和明确,减少误操作。

推荐在处理分支时使用 git switch,而使用 git checkout 处理文件恢复或其他复杂的操作。

检出特定的提交快照,可以使用 git checkout 命令。

在这里插入图片描述

  1. 检出指定的提交快照:

    git checkout 9b69c9a
    

    这将使你的工作目录处于提交 9b69c9a 的状态。注意,检出提交的方式会将你置于一个“分离头指针”(detached HEAD)状态,这意味着你并不在某个分支上,而是直接检出了一个历史提交。

  2. 如果你需要继续在该快照的基础上进行开发,可以创建一个新的分支:

    git checkout -b <新分支名>
    

例如:

git checkout -b old_snapshot

这将会在 9b69c9a 提交的基础上创建一个新的分支,允许你在该分支上继续开发。如果你只是想临时查看某个提交,git checkout 是一个合适的选择,但要小心在“分离头指针”状态下进行开发。

总结

  • 使用 git checkout <提交ID> 检出历史提交。
  • 如果要继续开发,建议创建新分支。

在 Git 的较新版本中,git switchgit restore 被引入作为替代命令,以提供更清晰的操作方式,替代一些 git checkout 的功能。

1. git switch

git switch 主要用于在分支之间切换,替代了 git checkout <分支名> 的功能。

  • 切换到一个已有的分支:
    git switch <分支名>
    
  • 创建并切换到一个新分支:
    git switch -c <新分支名>
    

但需要注意的是,git switch 不能直接用来检出特定的提交。如果你想检出一个历史提交,还是需要使用 git checkoutgit restore

2. git restore

git restore 是 Git 新版本中的另一个替代命令,用于恢复工作目录中的文件或者工作区的某些状态。

  • 恢复单个文件到某个提交时的状态:

    git restore --source=<提交ID> <文件名>
    
  • 如果你想检出整个工作目录的特定快照,可以使用:

    git restore --source=<提交ID> .
    

检出特定提交的推荐做法

虽然 git switch 不能用于检出特定的提交,但是你可以使用 git restore 来实现类似功能,或者继续使用 git checkout

  • 使用 git restore

    git restore --source=<提交ID> .
    
  • 继续使用 git checkout 检出特定提交:

    git checkout <提交ID>
    

在新版本的 Git 中,虽然 git checkout 仍然有效,但 git switchgit restore 提供了更明确的分工,减少了 git checkout 的多重用法带来的混淆。

git restore 需要你指定要恢复的路径或文件。

在使用 git restore --source=<提交ID> 时,必须明确告诉 Git 你要恢复哪些文件或整个工作目录。

如果你想恢复整个工作目录到特定提交的状态,可以使用 . 代表当前目录的所有文件,完整的命令应该是:

git restore --source=9b69c9a2b1130e0b408ba9a8caaf62fbd9dab03f .

此命令会将当前工作目录恢复到 9b69c9a2b1130e0b408ba9a8caaf62fbd9dab03f 这个提交的状态。

注意事项:

  • 该命令不会移动当前分支的指针,也不会修改 HEAD 的位置。如果你想回到这个提交并进行进一步开发,你可能还需要创建一个新分支。

如果你需要检出整个提交(不仅仅是文件的状态),可以考虑继续使用 git checkout <提交ID> 进行操作,然后根据需要创建分支:

git checkout 9b69c9a2b1130e0b408ba9a8caaf62fbd9dab03f

这会把你的工作目录恢复到该提交,并进入“分离头指针”(detached HEAD)状态。如果你想在这个提交的基础上继续开发,建议立即创建新分支:

git checkout -b <新分支名>

“分离头指针”(detached HEAD)状态

“分离头指针”(detached HEAD)状态是指当你在 Git 中检出一个特定的提交而不是一个分支时,Git 会进入这一特殊状态。它意味着你的工作目录已经指向了某个具体的提交,而不是分支的最新提交。这种状态下,你的 HEAD 不再指向某个分支,而是指向某个提交的哈希值。

举个例子:

当你使用 git checkout <提交ID> 检出一个特定的提交时,例如:

git checkout 9b69c9a2b1130e0b408ba9a8caaf62fbd9dab03f

此时,Git 不会让 HEAD 指向一个分支(如 maindevelop),而是直接指向这个提交 9b69c9a2b1130e0b408ba9a8caaf62fbd9dab03f。这就是“分离头指针”状态。

在“分离头指针”状态下做什么?

  • 你可以查看代码、运行代码、测试代码等。
  • 你可以进行更改并创建提交,但这些提交不会关联到任何分支。
  • 如果你继续提交,除非你创建了一个新的分支保存这些提交,否则你将很难找到这些提交,因为它们不属于任何分支。

如何在“分离头指针”状态下工作?

  1. 检出特定提交
    你可以检出历史中的任何提交,如:

    git checkout <提交ID>
    

    现在你处于“分离头指针”状态。

  2. 继续工作并保存进度
    如果你希望基于这个状态继续开发,你应该立即创建一个新分支,将你的工作保存到一个分支上:

    git checkout -b <新分支名>
    

    这会创建一个新的分支并将你的 HEAD 指向该分支,避免丢失你未来的工作。

  3. 丢弃临时工作
    如果你在“分离头指针”状态下进行了一些实验性工作,但并不想保存,可以通过切换回其他分支来丢弃这些更改:

    git switch <分支名>
    

    或者使用 git checkout <分支名> 切换回某个分支。

“分离头指针”状态的常见用途:

  • 查看历史提交:你可以临时检出某个历史提交来查看旧的代码状态或进行调试。
  • 调试或实验:在临时状态下做一些实验性的更改,之后可以决定是否保留这些更改。
  • 基于特定提交创建新分支:当你发现一个历史提交很重要或你想基于它继续开发时,可以检出该提交并创建一个新的分支。

注意事项:

如果你在“分离头指针”状态下进行了提交,而没有创建新分支,那么这些提交将变得不容易找到,因为它们不会在任何分支的历史记录中。如果你切换到另一个分支,分离头指针下的提交可能会被垃圾回收(GC)删除。

总结:

  • “分离头指针”状态意味着 HEAD 指向某个特定提交,而不是分支。
  • 可以在此状态下进行查看、测试、修改代码,但如果想保存进度,应尽快创建新分支。
  • 未保存的工作在离开此状态时可能会丢失。

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

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

相关文章

html中的文本标签(含标签的实现案例)

目录 1.标题标签 2.标题标签的align属性 3.段落标签 4.水平线标签hr 5.换行标签br 6.文本样式标签font ​编辑7.文本格式化标签 8.文本语义标签 1&#xff09;时间time标签 2&#xff09;文本高亮Mark标签 3&#xff09;cite标签 9.特殊字符标签 10.图像标签img 附录&#xff…

安卓使用memtester进行内存压力测试

memteser简介 memtester 是一个用于测试内存可靠性的工具。 它可以对计算机的内存进行压力测试&#xff0c;以检测内存中的错误&#xff0c;例如位翻转、随机存取错误等。memtester 可以在不同的操作系统上运行&#xff0c;并且可以针对不同大小的内存进行测试。 下载源码 m…

【Python】Python知识总结浅析

Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年首次发布。它以简洁的语法和强大的功能著称&#xff0c;适用于多种应用场景&#xff0c;包括Web开发、数据分析、人工智能、自动化脚本等。 易于学习和使用&#xff1a;Python的语法简洁明了&#xff0c;适合初…

【Windows】在任务管理器中隐藏进程

在此前的一篇&#xff0c;我们已经介绍过了注入Dll 阻止任务管理器结束进程 -- Win 10/11。本篇利用 hook NtQuerySystemInformation 并进行断链的方法实现进程隐身&#xff0c;实测支持 taskmgr.exe 的任意多进程隐身。 任务管理器 代码&#xff1a; // dllmain.cpp : 定义 …

RabbitMQ篇(基本介绍)

目录 一、简介 二、作用 三、AMQP协议 1. 简介 2. 核心概念 四、工作原理 五、工作模式 1. 普通模式 2. Worker模式 3. PubSub模式 4. Rounting模式 5. Topic模式 6. RPC模式 7. Publisher Confirms模式 六、基本结构 七、常见五个角色 一、简介 RabbitMQ 是一…

828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接

营运版的即时通讯IM聊天交友系统&#xff1a;特点可发红包&#xff0c;可添加多条链接到用户网站和应用&#xff0c;安卓苹果APPPC端H5四合一 后端开发语言&#xff1a;PHP&#xff0c; 前端开发语言&#xff1a;uniapp混合开发。 集安卓苹果APPPC端H5四合一APP源码&#xff0…

推理攻击-Python案例

1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法&#xff1a;用模型对训练数据标签进行拟合&#xff0c;拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击&#xff08;…

旋转花键高效运行关键之一

旋转花键是一种广泛应用于机械设备中的重要部件&#xff0c;具有传递扭矩、承受载荷和维持运动精度等功能&#xff0c;而旋转花键润滑脂则是确保其正常运作的关键因素之一。事实上&#xff0c;旋转花键润滑油的选择是一个综合性的过程&#xff0c;需要考虑多个因素以确保设备的…

图解Linux文件属性与目录配置

Linux的文件属性十分重要&#xff0c;与windows的文件属性有很大不同&#xff0c;Linux的文件增加了许多属性&#xff0c;如读写、连接数、文件拥有者及所属群组。如果一个文件属于一个群组&#xff0c;那么这个群组的成员就可以访问&#xff0c;其他的群组就不能访问&#xff…

Vue组件库Element-ui

Vue组件库Element-ui Element是一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库。Element - 网站快速成型工具 安装element-ui npm install element-ui # element-ui版本&#xff08;可以指定版本号引入ElementUI组件库&#xff0c;在main.js中添加内容得到&…

在线教育系统开发:SpringBoot技术实战

3系统分析 3.1可行性分析 通过对本微服务在线教育系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本微服务在线教育系统采用SSM框架&#xff0c;JAVA作为开…

汽车追尾为什么是后车的责任?

简单点说&#xff1a;因为人后面没有长眼睛。 结论 在汽车追尾事故中&#xff0c;通常情况下后车被认为是责任方的原因在于交通法规对驾驶安全标准的约定和实践中的责任识别原则。虽然追尾事故常见地被归责于后车&#xff0c;但具体判断并不是绝对的&#xff0c;仍需综合多种…

101. 对称二叉树【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 递归3.2 迭代 四、参考代码4.1 递归4.2 迭代 零、原题链接 101. 对称二叉树 一、题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 进阶&#xff1a;你可以运用递归和迭代两种方法解决…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

Linux的环境变量

环境变量是告诉操作系统在实行命令时在哪个路径下去找对应的命令程序 1.env命令查看当前系统的环境变量 2.环境变量path 此时有三个路径,当操作某命令时会先向path里的路径查看输入的命令在不在这些路径下 eg:输入cd命令,会先在cd命令在不在这三个路径,在就直接执行,不用切换…

微软GraphRAG实战解析:全局理解力如何超越传统RAG

微软近日开源了新一代RAG框架GraphRAG&#xff0c;以解决当前RAG在大型语料库上全局理解问题。当前RAG主要聚焦于局部检索能力&#xff0c;即根据查询语句在向量库中匹配部分知识&#xff0c;然后通过大型语言模型合成这些检索到的信息&#xff0c;生成一个自然流畅的回答。相信…

Python和C++胶体粒子三维残差算法模型和细化亚像素算法

&#x1f3af;要点 使用信噪比、对比度噪声比和点扩展函数量化实验数据&#xff0c;增强共聚焦显微镜成像。参考粒子跟踪算法&#xff1a;使用二维和三维径向模型细化亚像素。胶体粒子三维图形分割学习模型模拟检测球形胶体。使用网格搜索优化模型和归一化处理以避免光漂白。 …

UDP协议【网络】

文章目录 UDP协议格式 UDP协议格式 16位源端口号&#xff1a;表示数据从哪里来。16位目的端口号&#xff1a;表示数据要到哪里去。16位UDP长度&#xff1a;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的长度。16位UDP检验和&#xff1a;如果UDP报文的检验和出错&…

【深度强化学习】DDPG实现的4个细节(OUNoise等)

文章目录 前言一、论文内容简述创新点&#xff08;特点&#xff0c;与DQN的区别&#xff09;&#xff1a;可借鉴参数&#xff1a;细节补充&#xff1a; 二、细节1&#xff1a;weight_decay原理代码 三、细节2&#xff1a;OUNoise原理代码 四、细节3&#xff1a;ObsNorm原理代码…

Linux聊天集群开发之环境准备

一.windows下远程操作Linux 第一步&#xff1a;在Linux终端下配置openssh&#xff0c;输入netstate -tanp,查看ssh服务是否启动&#xff0c;默认端口22.。 注&#xff1a;如果openssh服务&#xff0c;则需下载。输入命令ps -e|grep ssh, 查看如否配有&#xff0c; ssh-agent …