Git Worktree 使用

新入职了一家公司,发现不同项目用的使用一个 git 仓库管理。不久之后我看到这篇文章。

Git 的设计部​​分是为了支持实验。一旦你确定你的工作被安全地跟踪,并且存在安全的状态,以便在出现严重错误时可以恢复,你就不会害怕尝试新的想法。然而,创新的代价之一就是你可能会在过程中弄得一团糟。文件会被重命名、移动、删除、更改,甚至被分割成多个文件。新的文件会被引入。你不想跟踪的临时文件会在你的工作目录中驻留。

简而言之,你的工作区变成了一座纸牌屋,在“快要正常工作了!”“哦不,我做了什么?”之间艰难地平衡着。那么,当你需要让仓库在某个下午恢复到已知状态以便完成一些实际工作时,该怎么办呢?经典命令 git branch 和git stash 会立即浮现在你的脑海中,但它们的设计初衷并非以某种方式处理未跟踪文件、更改的文件路径以及其他重大变更,而存储工作以供日后使用会让人感到困惑。答案是 Git worktree。

什么是 Git 工作树

跳至内容

Git 工作树是 Git 仓库的链接副本,允许您一次检出多个分支。工作树与主工作副本有独立的路径,但可以处于不同的状态并位于不同的分支。Git 中新工作树的优势在于,您可以进行与当前任务无关的更改,提交更改,然后在稍后合并,所有这些都不会干扰您当前的工作环境。

一个典型的例子,直接来自git-worktree手册页:你正在为一个项目开发一个令人兴奋的新功能,这时项目经理告诉你,需要紧急修复一个问题。问题在于,由于你正在开发一个重要的新功能,你的工作仓库(你的“工作树”)一片混乱。你不想把修复工作“偷偷”拖进当前的冲刺阶段,也不想为了修复这个功能而存储更改,创建一个新的分支。于是,你决定创建一个新的工作树,以便在那里进行修复:

$ git branch | tee
* dev
trunk
$ git worktree add -b hotfix ~/code/hotfix trunk
Preparing ../hotfix (identifier hotfix)
HEAD is now at 62a2daf commit

在你的目录中code,现在有一个名为 的新目录hotfix,它是一个链接到你主项目仓库的 Git 工作树,它HEAD位于名为 的分支trunk。现在你可以将此工作树视为你的主工作区。你可以将目录切换到该目录,进行紧急修复,提交修复,并最终删除该工作树:

$ cd ~/code/hotfix
$ sed -i 's/teh/the/' hello.txt
$ git commit --all --message 'urgent hot fix'

完成紧急工作后,您可以返回上一个任务。您可以控制何时将修补程序集成到主项目中。例如,您可以将更改直接从其工作树推送到项目的远程仓库:

$ git push origin HEAD
$ cd ~/code/myproject

或者您可以将工作树存档为 TAR 或 ZIP 文件:

$ cd ~/code/myproject
$ git archive --format tar --output hotfix.tar master

或者您可以从单独的工作树本地获取更改:

$ git worktree list
/home/seth/code/myproject  15fca84 [dev]
/home/seth/code/hotfix     09e585d [master]

从那里,您可以使用最适合您和您的团队的策略合并您的更改。

列出活动工作树

您可以使用以下命令获取工作树列表并查看每个工作树已检出的分支git worktree list

$ git worktree list
/home/seth/code/myproject  15fca84 [dev]
/home/seth/code/hotfix     09e585d [master]

您可以在任一工作树中使用它。工作树始终保持链接(除非您手动移动它们,否则 Git 将无法定位工作树,从而切断链接)。

移动工作树

Git 跟踪项目.git目录中工作树的位置和状态:

$ cat ~/code/myproject/.git/worktrees/hotfix/gitdir 
/home/seth/code/hotfix/.git

如果需要重新定位工作树,则必须使用git worktree move;否则,当 Git 尝试更新工作树的状态时,将会失败:

$ mkdir ~/Temp
$ git worktree move hotfix ~/Temp
$ git worktree list
/home/seth/code/myproject  15fca84 [dev]
/home/seth/Temp/hotfix     09e585d [master]

删除工作树

完成工作后,可以使用remove子命令将其删除:

$ git worktree remove hotfix
$ git worktree list
/home/seth/code/myproject  15fca84 [dev]

为了确保.git目录干净,请prune在删除工作树后使用子命令:

$ git worktree prune

何时使用工作树

与许多选项一样,无论是标签页、书签还是自动备份,您都需要自行跟踪生成的数据,否则可能会不堪重负。不要过于频繁地使用工作树,以免最终导致您的代码库副本多达 20 个,每个副本的状态都略有不同。我发现最好的方法是创建一个工作树,执行需要它的任务,提交工作,然后删除该工作树。保持简洁和专注。

重要的是,工作树为 Git 仓库的管理提供了更高的灵活性。在需要的时候使用它们,再也不用为了检查其他分支上的内容而费力地保存工作状态了。

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

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

相关文章

维智定位 Android 定位 SDK

概述 维智 Android 定位 SDK是为 Android 移动端应用提供的一套简单易用的定位服务接口,为广大开发者提供融合定位服务。通过使用维智定位SDK,开发者可以轻松为应用程序实现极速、智能、精准、高效的定位功能。 重要:为了进一步加强对最终用…

【CSS】使用 CSS 绘制三角形

一、Border 边框法(最常用) 原理:通过设置元素的宽高为 0,利用透明边框相交形成三角形。 .triangle {width: 0;height: 0;border-left: 50px solid transparent; /* 左侧边框透明 */border-right: 50px solid transparent; /* …

RabbitMQ 快速上手:安装配置与 HelloWorld 实践(一)

一、引言 在当今分布式系统大行其道的技术浪潮下,各个服务之间的通信与协同变得愈发复杂。想象一下,一个电商系统在大促期间,订单服务、库存服务、支付服务、物流服务等众多模块需要紧密配合。如果没有一种高效的通信机制,系统很容…

【deekseek】TCP Offload Engine

是的,TOE(TCP Offload Engine)通过专用硬件电路(如ASIC或FPGA)完整实现了TCP/IP协议栈,将原本由CPU软件处理的协议计算任务完全转移到网卡硬件中。其延迟极低的核心原因在于 硬件并行性、零拷贝架构 和 绕过…

JavaScript 的编译与执行原理

文章目录 前言🧠 一、JavaScript 编译与执行过程1. 编译阶段(发生在代码执行前)✅ 1.1 词法分析(Lexical Analysis)✅ 1.2 语法分析(Parsing)✅ 1.3 语义分析与生成执行上下文 🧰 二…

WORD个人简历单页326款模版分享下载

WORD个人简历模版下载:WORD个人简历模版https://pan.quark.cn/s/7e79a822c490

Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)

PDFView 是一个用于在 Android 应用中显示 PDF 文档的库。它提供了丰富的功能和灵活的配置选项,使得开发者能够轻松地在应用中嵌入 PDF 阅读器。 一、 添加依赖 在模块的 build.gradle 文件中添加以下依赖: // pdfimplementation("com.github.bar…

微信小程序学习之搜索框

1、第一步&#xff0c;我们在index.json中引入vant中的搜索框控件&#xff1a; {"usingComponents": {"van-search": "vant/weapp/search/index"} } 2、第二步&#xff0c;直接在index.wxml中添加布局&#xff1a; <view class"index…

OpenCL C++ 常见属性与函数

核心对象与属性 对象/属性描述示例cl::Platform表示OpenCL平台cl::Platform::get(&platforms)cl::Device表示计算设备cl::Device::getDefault()cl::Context管理设备、内存和命令队列的上下文cl::Context(contextDevices)cl::CommandQueue命令队列,用于提交命令cl::Command…

Milvus 视角看重排序模型(Rerankers)

在信息检索和生成式人工智能领域&#xff0c;重排序器是优化初始搜索结果顺序的重要工具。重排序器与传统的嵌入模型不同&#xff0c;它将查询和文档作为输入&#xff0c;并直接返回相似度得分&#xff0c;而不是嵌入。该得分表示输入查询和文档之间的相关性。 重排序器通常在…

C语言:gcc 如何调用 Win32 打开文件对话框 ?

在 Windows 平台上使用 gcc 调用原生 Win32 API 实现文件打开对话框是可行的&#xff0c;但需要直接使用 Win32 的 GetOpenFileName 函数&#xff08;位于 commdlg.h 头文件&#xff0c;依赖 comdlg32.lib 库&#xff09;。以下是完整实现步骤和代码示例&#xff1a; 编写 file…

计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)

EMD-SSA-VMD-LSTM混合模型 一、环境配置与依赖二、数据生成&#xff08;示例数据&#xff09;三、多级信号分解1. 经验模态分解&#xff08;EMD&#xff09;2. 奇异谱分析&#xff08;SSA&#xff09;3. 变分模态分解&#xff08;VMD&#xff09; 四、数据预处理1. 归一化处理2…

vue配置子路由,实现点击左侧菜单,内容区域显示不同的内容

文章目录 一、路由链路二、实现步骤准备二级路由下的.vue文件配置子路由声明router-view标签为菜单项 el-menu-item 设置index属性&#xff0c;设置点击后的路由路径 三、参考资料 一、路由链路 二、实现步骤 准备二级路由下的.vue文件 配置子路由 router/index.js import {…

ModuleNotFoundError: No module named ‘SDToolbox‘

(py311) C:>python Python 3.11.11 | packaged by Anaconda, Inc. | (main, Dec 11 2024, 16:34:19) [MSC v.1929 64 bit (AMD64)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. from SDToolbox import PostShock_eq Tracebac…

Hi3516DV500刷写固件

hi3516DV500刷固件 1、硬件连接 2、软件准备 3、刷固件步骤 一、硬件连接 特别注意的是&#xff0c;串口的接线顺序 通过网线连接好笔记本和开发板后&#xff0c;需要确认一下网口水晶头是否闪烁&#xff0c;以确认网络物理是否连通 二、软件资源准备 固件包准备 打开工具…

正则表达式r前缀使用指南

正则表达式中的 r&#xff1a;解锁字符串转义的魔法 正则表达式是处理字符串的强大工具&#xff0c;但它常常伴随着转义字符的复杂性。如果你曾因 \n、\t 或 \\ 的使用而困惑&#xff0c;那么这篇文章将为你揭开谜底&#xff0c;解释为什么 r 是正则表达式中的「神奇武器」。本…

网络攻防模拟:城市安全 “数字预演”

在当今数字化快速发展的时代&#xff0c;网络安全和城市安全面临着前所未有的挑战。为有效应对这些挑战&#xff0c;利用先进的技术搭建模拟演练平台至关重要。图扑软件的 HT for Web 技术&#xff0c;为网络攻防模拟与城市安全演练提供了全面且高效的解决方案。 三维场景搭建&…

AI模型开发全流程笔记

一、训练数据准备阶段 数据采集标准 格式要求&#xff1a;严格QA对形式&#xff08;1问1答&#xff09; 数量基准&#xff1a; 基础量&#xff1a;500组QA对 优化量&#xff1a;800-1000组QA对 内容规范&#xff1a; 聚焦单一业务节点&#xff08;如售后场景&#xff09; …

1688 数据接口调用秘籍:高效获取商品实时信息的开发指南

在电商行业竞争白热化的当下&#xff0c;企业想要抢占市场先机&#xff0c;实时掌握商品信息至关重要。作为国内 B2B 电商巨头&#xff0c;1688 平台汇聚海量商品资源&#xff0c;通过高效调用其数据接口获取商品实时信息&#xff0c;能为企业价格策略制定、库存管理、竞品分析…

milvus学习笔记

本文主要由AI生成&#xff0c;请注意自己查看源代码校验。 Milvus v2.4 系统架构概览 Milvus 采用分布式微服务架构&#xff0c;将计算层&#xff08;Proxy、QueryCoord、QueryNode、IndexCoord、DataCoord、DataNode 等&#xff09;与存储层&#xff08;Pulsar、MinIO/S3、e…