git:指令集

news2025/1/6 22:35:09

以下是对这些 Git 新特性和命令的更详细解读和实际用例分析,帮助更好地理解它们的作用及适用场景:


1. git switchgit 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 switchgit restore 替代 git checkout
  • 在大型项目中,结合 git worktreegit sparse-checkout 提高开发效率。
  • 使用 git maintenancegit 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 switchgit restore

8. git reset (回退到指定提交)

作用:

  • 主要用于撤销提交或重置文件的状态。

三种模式:

  1. --soft:保留工作区和暂存区的更改,仅回退提交记录。

    git reset --soft HEAD~1  # 回退到上一个提交
    
  2. --mixed(默认):保留工作区的更改,但清空暂存区。

    git reset HEAD~1
    
  3. --hard:彻底回退,包括清空工作区的更改,无法恢复!

    git reset --hard HEAD~1
    

常用操作:

  • 回退到指定提交:
    git reset --hard commit-hash
    
    **仅从暂存区移除文件**
    git reset file.txt
    

注意:

  • reset 会修改提交历史,可能导致数据丢失,不适合已推送的分支。

9. git revert (撤销特定提交)

作用:

  • 创建一个新的提交来反向应用某次提交的更改。

reset 的区别:

  • revert 是安全操作,不会修改提交历史,适合已推送的分支。

用法:

  1. 撤销指定提交:

    git revert commit-hash
    
  2. 批量撤销多个提交:

    git revert commitA..commitB
    
  3. 自动跳过冲突提示:

    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:修复提交历史
  1. 假设你误提交了错误内容:
    git commit -m "Wrong changes"
    
  2. 使用 reset 回退到暂存区:
    git reset HEAD~1
    
  3. 修改文件后重新提交:
    git add file.txt
    git commit -m "Correct changes"
    

案例 2:撤销错误的合并
  1. 假设最近一次合并出现问题:
    git merge feature-branch
    
  2. 使用 revert 撤销合并:
    git revert -m 1 commit-hash
    

案例 3:恢复误删的分支
  1. 假设你意外删除了分支:
    git branch -d feature-branch
    
  2. 查找分支的最后一次操作记录:
    git reflog
    
  3. 恢复分支:
    git branch feature-branch commit-hash
    

案例 4:稀里糊涂丢了提交,如何恢复
  1. 假设你执行了以下命令丢失了更改:
    git reset --hard HEAD~2
    
  2. 查找丢失的提交:
    git reflog
    
  3. 恢复到丢失的提交:
    git reset --hard commit-hash
    
命令适用场景
checkout切换分支、恢复文件、查看特定提交的文件内容。
reset回退到某个提交,修改提交历史(慎用在已推送分支)。
revert撤销特定提交的更改,生成新的提交(安全撤销)。
reflog查看本地分支的所有操作记录,恢复被误删除或回退的提交。

HEAD 的作用

HEAD 是 Git 中的一个特殊的指针,它始终指向当前活动分支的最新提交。可以理解为 Git 用来追踪“当前工作位置”的标记。通过操作 HEAD,我们可以切换分支、回退提交、检出历史版本等。


HEAD 的主要特性

  1. 指向当前分支的最新提交:

    • 在分支上工作时,HEAD 通常指向该分支的名称,例如 maindev 等。
    • 例如:
      HEAD -> main
      
    • 这表示当前 HEAD 绑定到 main 分支,而 main 分支指向它的最新提交。
  2. 可临时指向特定提交:

    • 如果使用 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

注意事项

  1. 分离状态的风险:

    • 在分离状态中,如果你没有创建新分支,做的所有提交都可能丢失。
    • 建议在需要继续工作的场景下,创建新分支:
      git checkout -b temp-branch
      
  2. HEAD 相关的误操作:

    • 使用 git reset --hard 修改 HEAD 时,要谨慎操作,避免丢失工作区的更改。

什么是分离状态(Detached HEAD)?

通常情况下,HEAD 是指向一个分支的,比如 mainfeature-branch。当你在某个分支上工作时,HEAD 会跟踪该分支的最新提交。

但是,当你检出(checkout)一个具体的提交哈希值,而不是分支名时,HEAD 就直接指向该提交,而不是分支。这就是所谓的“分离状态”。


为什么叫分离状态?

在分离状态下:

  1. HEAD 不再跟踪任何分支,而是直接指向某个具体的提交。
  2. 你可以查看或修改代码,但这些更改不会被关联到任何分支上,除非你创建一个新的分支。

如何进入分离状态?

分离状态通常发生在以下情况下:

1. 检出一个具体的提交
git checkout commit-hash
  • 这会让 HEAD 指向指定的提交,而不是当前分支的最新提交。
2. 检出一个标签(Tag)
git checkout v1.0.0
  • 标签通常指向一个具体的提交,检出标签也会导致 HEAD 分离。
3. 检出远程分支未合并的提交
git checkout origin/feature-branch
  • 如果本地没有该分支,直接检出远程分支的提交也会导致分离状态。

分离状态下会发生什么?

  1. 查看代码是安全的:

    • 你可以安全地查看指定提交的代码,不会对其他分支造成影响。
  2. 提交的更改可能丢失:

    • 如果你在分离状态下修改代码并提交:
      git commit -m "Work in detached HEAD"
      
      这些更改不会自动关联到任何分支,可能导致提交变得“孤立”。
  3. 你需要创建新分支保存工作:

    • 如果不想丢失提交,需要创建一个新分支:
      git checkout -b new-branch
      

分离状态的工作流程

例子:检出历史提交

假设当前分支是 main,它的提交历史如下:

A -> B -> C -> D (HEAD, main)

你运行以下命令:

git checkout B

此时:

  1. HEAD 会直接指向提交 B
  2. main 分支仍然指向提交 D
  3. 工作区的代码被恢复为提交 B 的状态。

结果:

A -> B (HEAD) -> C -> D (main)

如果你在这个状态下修改文件并提交:

git commit -m "New commit"

提交历史会变成这样:

A -> B -> E (HEAD) -> C -> D (main)

注意: 提交 E 不属于任何分支,是孤立的。

解决孤立提交:
  1. 如果你想保留提交 E,需要创建一个新分支:

    git checkout -b temp-branch
    

    新分支 temp-branch 会指向提交 E,保留你的工作。

  2. 如果你直接切换到其他分支而没有保存,提交 E 会被垃圾回收机制清理掉。


如何离开分离状态?

如果你不打算保留分离状态下的任何修改,可以直接切换回分支:

git checkout main

分离状态的注意事项

  • 分离状态适合以下场景:

    • 检查代码在特定历史版本中的状态。
    • 调试某个历史提交。
    • 基于某个历史提交开始新的开发。
  • 不适合长期工作:

    • 因为分离状态的更改不被分支记录,很容易导致工作丢失。

总结

当你在分离状态下,HEAD 不再绑定到某个分支,而是直接指向某个提交。虽然你可以修改和提交代码,但这些提交是孤立的,必须创建新分支来保存。分离状态通常用于查看或临时操作历史版本,但需要注意保存工作,以免丢失更改。

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

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

相关文章

CSS——5. 外部样式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>方法3&#xff1a;外部样式</title><link rel"stylesheet" href"a.css" /><link rel"stylesheet" href"b.css"/&g…

玩游戏提示找不到vcruntime140.dll,修复方法分享

在玩游戏时&#xff0c;电脑突然弹出“找不到vcruntime140.dll”的提示怎么回事&#xff1f;玩游戏时提示找不到vcruntime140.dll文件时&#xff0c;这通常意味着你的系统中缺少了这个关键的DLL文件&#xff0c;或者该文件已损坏。vcruntime140.dll是Visual C运行时库的一部分&…

Aloudata AIR | 逻辑数据平台的 NoETL 之道

一文为你介绍 Aloudata AIR 逻辑数据平台的技术原理与核心价值 本文主旨是介绍逻辑数据平台的技术原理与核心价值&#xff0c;包含几个部分的内容&#xff1a; 首先&#xff0c;简要阐述逻辑数据平台出现的背景&#xff1b;其次&#xff0c;详细讲解逻辑数据平台的构建方法&am…

电子应用设计方案86:智能 AI背景墙系统设计

智能 AI 背景墙系统设计 一、引言 智能 AI 背景墙系统旨在为用户创造一个动态、个性化且具有交互性的空间装饰体验&#xff0c;通过融合先进的技术和创意设计&#xff0c;提升室内环境的美观度和功能性。 二、系统概述 1. 系统目标 - 提供多种主题和风格的背景墙显示效果&…

12306分流抢票软件 bypass v1.16.43 绿色版(春节自动抢票工具)

软件介绍 12306Bypass分流抢票软件&#xff0c;易操作强大的12306抢票软件&#xff0c;全程自动抢票&#xff0c;云识别验证码打码&#xff0c;多线程秒单、稳定捡漏&#xff0c;支持抢候补票、抢到票自动付款&#xff0c;支持多天、多车次、多席别、多乘客、短信提醒等功能。…

MiFlash 线刷工具下载合集

MiFlash 线刷工具下载合集 MiFlash 线刷工具下载合集 – MIUI历史版本相较于小米助手的刷机功能&#xff0c;线刷还是偏好使用 MiFlash。特点是界面简单纯粹&#xff0c;有自定义高级选项&#xff0c;可以选择刷机不上 BL 锁&#xff0c;自定义刷机脚本&#xff0c;EDL 刷机模…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…

第五届电网系统与绿色能源国际学术会议(PGSGE 2025)

2025年第五届电网系统与绿色能源国际学术会议(PGSGE 2025) 定于2025年01月10-12日在吉隆坡召开。 第五届电网系统与绿色能源国际学术会议&#xff08;PGSGE 2025&#xff09; 基本信息 会议官网&#xff1a;www.pgsge.org【点击投稿/了解会议详情】 会议时间&#xff1a;202…

Python爬虫 - 豆瓣图书数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …

Java 数据库连接 - Sqlite

Java 数据库连接 - Sqlite PS: 1. 连接依赖库&#xff1a;[sqlite-jdbc-xxx.jar](https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc)(根据连接的数据库版本选择) 2. 支持一次连接执行多次sql语句&#xff1b; 3. 仅本地连接&#xff1b;使用说明&#xff1a; publ…

组网实训实现

小型单元网络实现 IP划分&#xff1a; 外网:172.1.1.0/24 172.1.2.0/24 内网&#xff1a;基于192.168.3.0/24的子网划分 综合办公楼&#xff1a;192.168.3.00 000000 /26&#xff08;192.168.3.0-192.168.3.63&#xff09; 综合一楼&#xff1a;192.168.3.0000 0000 /28&…

如何在 VSCode 中配置 C++ 开发环境:详细教程

如何在 VSCode 中配置 C 开发环境&#xff1a;详细教程 在软件开发的过程中&#xff0c;选择一个合适的开发环境是非常重要的。Visual Studio Code&#xff08;VSCode&#xff09;作为一款轻量级的代码编辑器&#xff0c;凭借其强大的扩展性和灵活性&#xff0c;受到许多开发者…

UE5动画蓝图

动画蓝图&#xff0c;混合空间&#xff0c;状态机&#xff0c;瞄准偏移&#xff0c;动画蒙太奇&#xff0c;动画混合&#xff0c;骨骼绑定&#xff0c;动画重定向&#xff0c;动画通知&#xff0c;Control Rig…… 虚幻动画模块是一个庞大的系统&#xff0c;大模块里又包含很多…

腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎

在当今数字化时代的汹涌浪潮中&#xff0c;数据已跃升为企业发展的关键要素&#xff0c;其高效、精准的处理成为企业在激烈市场竞争中脱颖而出的核心竞争力。腾讯云智能结构化 OCR 技术凭借其前沿的科技架构与卓越的功能特性&#xff0c;宛如一颗璀璨的明星&#xff0c;在交通、…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…

USB 驱动开发 --- Gadget 设备连接 Windows 免驱

环境信息 测试使用 DuoS(Arm CA53&#xff0c; Linux 5.10) 搭建方案验证环境&#xff0c;使用 USB sniff Wirekshark 抓包分析&#xff0c;合照如下&#xff1a; 注&#xff1a;左侧图中设备&#xff1a;1. 蓝色&#xff0c;USB sniff 非侵入工 USB 抓包工具&#xff1b;2. …

java项目之读书笔记共享平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 读书笔记共享平台的主要使…

git知识点汇总

git init 初始化一个git仓库&#xff0c;后面可以加仓库名&#xff0c;在当前目录下创建指定名称的目录并在该目录下创建仓库&#xff0c;若不加则直接在当前目录下创建仓库。git仓库的三个区域&#xff1a;工作区&#xff08;当前目录&#xff09;、暂存区&#xff08;.git/in…

探索大型语言模型新架构:从 MoE 到 MoA

探索大型语言模型新架构&#xff1a;从 MoE 到 MoA 当前&#xff0c;商业科技公司纷纷投身于一场激烈的竞赛&#xff0c;不断扩大语言模型的规模&#xff0c;并为其注入海量的高质量数据&#xff0c;试图逐步提升模型的准确性。然而&#xff0c;这种看似顺理成章的发展路径逐渐…

单片机-静动态数码管实验

P0控制数码管 &#xff0c;P0低电平 P1,P2,P3高电平 1、静态数码管 需求&#xff1a;数码管显示0&#xff0c;即让p0端口输出数字0的段码0x3f(共阴) #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; //数码管显示数字的数组 共阴极 …