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

news2024/11/19 1:32:33

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.coloradmin.cn/o/2184003.html

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

相关文章

Cortex微控制器软件接口标准(CMSIS)

Cortex微控制器软件接口标准 目前&#xff0c;软件开发已经是嵌入式系统行业公认的主要开发成本&#xff0c;通过将所有Cortex-M芯片供应商产品的软件接口标准化&#xff0c;能有效降低这一成本&#xff0c;尤其是进行新产品开发或者将现有项目或软件移植到基于不同厂商MCU的产…

Golang | Leetcode Golang题解之第450题删除二叉搜索树的节点

题目&#xff1a; 题解&#xff1a; func deleteNode(root *TreeNode, key int) *TreeNode {var cur, curParent *TreeNode root, nilfor cur ! nil && cur.Val ! key {curParent curif cur.Val > key {cur cur.Left} else {cur cur.Right}}if cur nil {retur…

回首往事,感受change

今早&#xff0c;我收到了CSDN发来的消息&#xff0c;当我看了内容才发现&#xff0c;我不知不觉已经在CSDN里面创作了730天&#xff08;2年&#xff09;也是个非常值得纪念的日子。 今天&#xff0c;我来回顾一下我的以往&#xff0c;感受一下我的成长与变化。 梦的开始 大家…

【Python报错已解决】 Failed building wheel for opencv-python-headless

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

2024多模态大模型发展调研

随着生成式大语言模型应用的日益广泛&#xff0c;其输入输出模态受限的问题日益凸显&#xff0c;成为制约技术进一步发展的瓶颈。为突破这一局限&#xff0c;本文聚焦于研究多模态信息的协同交互策略&#xff0c;旨在探索一种能够统一理解与生成的多模态模型构建方法。在此基础…

C# 无边框窗体,加阴影效果、多组件拖动、改变大小等功能完美实现优化版效果体验

一、预览效果 国庆节第一天,祝祖国繁荣昌盛! 1.1 效果图 (WinForm无边框窗体,F11可全屏) 拖动窗体时半透明效果(拖动时参考窗体后面释放位置) 说明:本功能的实现基于网友的原型完善而来,更多代码可以参考他的文章 h

智能平衡移动机器人-平台硬件电路

目录 硬件电路主要模块包括&#xff1a; 主控制器 TMS320F28069数字信号处理器 电池 电机驱动电路 直流电机的驱动 编码器 传感器与外设模块 APP 为了使智能平衡移动机器人达到更好的平衡控制效果&#xff0c;机器人的本体设计更为轻便、集中。机器人的硬件电路也进行集…

课设实验-数据结构-单链表-文教文化用品品牌

题目&#xff1a; 代码&#xff1a; 正解&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #define MaxSize 10 //定义顺序表最大长度static int result; //字符串比较结果 static int i; //循环初始值 static bool flag; //记录结…

Typora使用与Markdown语法详细教程

Typora 基本介绍 Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器。Markdown 是一种 轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者 HTML&#xff09;文档。 安装 下载地址&#xff…

C语言 getchar 函数完全解析:掌握字符输入的关键

前言 在C语言中&#xff0c;getchar 是一个非常实用的函数&#xff0c;用于从标准输入流&#xff08;通常是键盘&#xff09;读取单个字符。这对于处理文本输入非常有用&#xff0c;尤其是在需要逐个字符处理的情况下。本文将深入探讨 getchar 函数的用法和特点&#xff0c;并…

开放式耳机是什么意思?哪个品牌好?开放式蓝牙耳机测评分享

开放式耳机是目前比较流行的一种蓝牙耳机类型&#xff0c;它凭借佩戴舒适、安全性高、透气性好以及健康卫生等等特点成为了很多人的耳机选择。但其实并没有太多人了解开放式耳机&#xff0c;不知道什么是开放式耳机、开放式耳机是否比封闭式耳机强、什么样的人适合开放式耳机以…

Optiver股票大赛Top2开源!

Optiver股票大赛Top2开源&#xff01; ↑↑↑关注后"星标"kaggle竞赛宝典 作者&#xff1a;杰少 Optiver第二名方案解读 简介 Optiver竞赛已经于今天结束了&#xff0c;竞赛也出现了极端情况&#xff0c;中间断崖式的情况&#xff0c;在Kaggle过往的竞赛中&#…

【电路基础 · 1】电路模型和电路定律(自用)

总览 1.电路和电路模型 2.电流和电压参考方向 3.电功率和能量 4.电路元件 5.电阻元件 6.电压源和电流源 7.受控电源 8.基尔霍夫定律 重点&#xff1a; 1.电压、电流的参考方向 2.电阻元件、电源元件的特性 3.基尔霍夫定律&#xff08;基尔霍夫电流定律KCL、基尔霍夫电压定律K…

【办公类-48-03】20240930每月电子屏台账汇总成docx-3(三园区合并EXCLE,批量生成3份word)

背景需求&#xff1a; 前期电子屏汇总是“总园”用“”问卷星”、“一分园”用“腾讯文档”&#xff0c;二分园“用“手写word”” 【办公类-48-02】20240407每月电子屏台账汇总成docx-2&#xff08;腾讯文档xlsx导入docx&#xff0c;每页20条&#xff09;【办公类-48-02】20…

C语言 | Leetcode C语言题解之题451题根据字符出现频率排序

题目&#xff1a; 题解&#xff1a; #define HASH_FIND_CHAR(head, findint, out) HASH_FIND(hh, head, findint, sizeof(char), out) #define HASH_ADD_CHAR(head, intfield, add) HASH_ADD(hh, head, intfield, sizeof(char), add)struct HashTable {char key;int val;UT_ha…

基于小程序+Vue + Spring Boot的进销存库存出库入库统计分析管理系统

目录 一、项目背景及需求分析 1. 项目背景 2. 需求分析 二、系统架构设计 1. 技术选型 2. 模块划分 三、数据库设计数据库表结构 四、前端实现 五、后端实现 1. RESTful API设计 2. 数据库操作 六、安全性和性能优化 1. 安全性 2. 性能优化 七、测试与部署 1. …

Unity之寻找子物体的8种方式

废话不多说&#xff0c;举个例子&#xff1a; 当前的transform是Cube1物体&#xff0c;所以。。。。 寻找子物体的方式有以下几个&#xff1a; 1.transform.Find("go2/go3") 好处&#xff1a;可以快速通过路径定位对应的子物体&#xff0c;甚至是子子子物体。 2.t…

UG NX二次开发(C++)-建模-采用NXOpen获取拉伸特征的信息

文章目录 1、前言2、创建一个特征3 采用NXOpen来实现拉伸特征信息的获取1、前言 UG NX二次开发过程中,大部分初学者喜欢用UFun函数来实现UG NX二次开发的功能,因为相较于NXOpen,UFun函数简单易懂;但是有时UFun函数如果初始值设置不好,出现的错误也比较难排查。比如对于拉…

L4 KNN 算法

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 KNN 算法用于约会数据集分类 在这周中&#xff0c;学习如何使用 K 近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;算法对一个约会数据集进行分类。KN…

SpringGateway(网关)微服务

一.启动nacos 1.查看linux的nacos是否启动 docker ps2.查看是否安装了nacos 前面是你的版本&#xff0c;后面的names是你自己的&#xff0c;我们下面要启动的就是这里的名字。 docker ps -a3.启动nacos并查看是否启动成功 二.创建网关项目 1.创建idea的maven项目 2.向pom.x…