都2024年了,你还不知道git worktree么?

三年前 python 大佬吉多·范罗苏姆(为 Python 程序设计语言的最初设计者及主要架构师)才知道 git worktree ,我现在才知道,我觉得没啥丢人的。
应用场景
如果你正在 feature 的分支中开发新功能,线上版本紧急错误又需要你基于 master 做修复。
可能有如下几种办法解决:
解法 1
- 将本地修改文件通过 git add . && git commit 提交到当前分支,或者通过 git stash 暂存起来
// feature branch
git add .
git commit
git checkout master
// or
git stash
git checkout master
- 分支切到 master,修复完问题后切回 feature
- 若之前是 commit 的可直接开发,若是 git stash 则 git stash pop 出来处理
解法 2
clone 一份同样远程代码到本地,切换到 master 分支来解决错误。
存在问题
解法 1 缺点:
- 若正在跑一个耗时较长的测试不能动工作区代码,则只能等了
- 用 git stash 方式,暂存和切走到修改完错误切回 feature 至少得 4 步,命令行切来切去也挺麻烦
解法 2 缺点:若远程仓库太大,则 clone 一次会很耗时。
针对上述场景,可以考虑用 git worktree 来解决,该命令可让你直接开一个独立工作区域出去做别的事,未 commit 的档案原封不动留在原来分支。
它如何工作
- 首先创建一个本地文件夹 worktree_test 并在 worktree_test 文件夹内创建 master 分支,然后在 master 内 git init;
mkdir worktree_test && cd worktree_test && mkdir master && cd master/ && git init
- 先模拟构造一个主干分支 master,向 rooi.txt 文件中写几行内容#1
//master
vi rooi.txt
cat rooi.txt
master:add:rooi.txt (#1)
git add rooi.txt
git commit -m "add:rooi.txt"
- 构造完主干分支 master 后,我们生成一个 feature 分支,该分支模拟开发功能分支,并写一些分支独有内容#2:feature:modify rooi.txt 和#4 生成一个临时 untracked file: a.temp
// new branch in master
git checkout -b feature
// feature
cat rooi.txt
master:add:rooi.txt (#1)
vi rooi.txt (#2)
cat rooi.txt
master:add:rooi.txt
feature:modify rooi.txt
git add rooi.txt (#3)
git commit -m "dev:modify"
[feature 4d300fb] dev:modify
1 file changed, 1 insertion(+)
touch a.temp (#4)
git status (#5)
Untracked files:
a.temp
线上紧急错误来了
此时我们在 feature 分支通过 git worktree add 建立一个工作区#1, 注意此时临时目录区在 d:\work\worktree_test 目录下
说明: git worktree add 中 ../bugfix 表示新建工作区名字,后面 master 表示跟进当前主干 master 分支来新建,也就是当前工作区 bugfix 是完全以 master 为基准建立的副本。
// d:\work\worktree_test\master in feature
git worktree add ../bugfix master (#1)
// to dir : d:\work\worktree_test
cd ..
// d:\work\worktree_test
ls
bugfix/ master/
cd bugfix
cat rooi.txt
master:add:rooi.txt
vi rooi.txt
cat rooi.txt
master:add:rooi.txt
bugfix:fix bug
git add rooi.txt (#3)
git commit -m "bugfix:fix bug"
如上,bugfix 分支是依照 master 分支构建工作区,此时可以直接提交到 master 分支上。
继续开发功能
通过#1 回到原来 master 目录下可以看到,之前提交和 untracked file 都存在,且在 feature 分支上,现场原样保持。
// in bugfix dir master
// d:\work\worktree_test\bugfix
cd ..
cd master (#1)
当然你也可以合并 bugfix 到 feature 分支
// feature
git merge master
如下效果图中,可以创建多个工作区副本

参考资料
It’s 2024, I Haven’t Used Git Worktree Yet | by David Lee | Mar, 2024 | Medium
都2024年了,你还不知道git worktree么?的更多相关文章
- 使用过Redis,我竟然还不知道Rdb
目录 使用过Redis,那就先说说使用过那些场景吧 Rdb文件是什么,它是干什么的 分析工具 小结 联想 推荐阅读 使用过Redis,那就先说说使用过那些场景吧 字符串缓存 //举例 $redis-& ...
- 你还不知道Vue的生命周期吗?带你从Vue源码了解Vue2.x的生命周期(初始化阶段)
作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...
- JDK15就要来了,你却还不知道JDK8的新特性!
微信搜「烟雨星空」,白嫖更多好文. 现在 Oracle 官方每隔半年就会出一个 JDK 新版本.按时间来算的话,这个月就要出 JDK15 了.然而,大部分公司还是在使用 JDK7 和 8 . 之前去我 ...
- 都2019年了,还问GET和POST的区别
摘要: 对比GET与POST. 原文:都9102年了,还问GET和POST的区别 作者:程淇铭 Fundebug经授权转载,版权归原作者所有. 1. 前言 最近看了一些同学的面经,发现无论什么技术岗位 ...
- CentOS 8 都发布了,你还不会用 nftables?
原文链接:CentOS 8 都发布了,你还不会用 nftables? 如果你没有生活在上个世纪,并且是云计算或相关领域的一名搬砖者,那你应该听说最近 CentOS 8 官方正式版已经发布了,CentO ...
- [转帖]CentOS 8 都发布了,你还不会用 nftables?
CentOS 8 都发布了,你还不会用 nftables? https://www.cnblogs.com/ryanyangcs/p/11611730.html 改天学习一下 原文链接:CentOS ...
- git worktree 是什么及其使用场景
先上总结: 在git worktree出现之前, git切换分支前后的文件都只存在在当前文件夹下, git worktree出现之后, 我们可以将分支切换到其他文件夹下 比如如果你的项目有很多个版本分 ...
- 再也不用克隆多个仓库啦!git worktree 一个 git 仓库可以连接多个工作目录
我在 feature 分支开发得多些,但总时不时被高优先级的 BUG 打断需要临时去 develop 分一个分支出来解 BUG.git 2.6 以上开始提供了 worktree 功能,可以解决这样的问 ...
- 接上篇:Git Worktree 高级使用,这样清爽多了
前言 上一篇文章 Git Worktree 大法真香 带大家了解了 git worktree 是如何帮助我同时在多个分支工作,并且互不影响的.但是创建 worktree 的目录位置不是在当前项目下,总 ...
- git worktree
git clone,不管是single-branch,还是non-single-branch,如果同时存在几个clone出来的branches,随着时间的推移,不停的编译.更新.编译...每个bran ...
随机推荐
- 绘制三元图、颜色空间图:R语言代码
本文介绍基于R语言中的Ternary包,绘制三元图(Ternary Plot)的详细方法:其中,我们就以RGB三色分布图为例来具体介绍. 三元图可以从三个不同的角度反映数据的特征,因此在很多领 ...
- 《HelloGitHub》第 96 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- kingbaseES V8R3集群运维案例之---集群部署前后ssh端口修改
kingbaseES V8R3集群运维案例之---集群部署前后ssh端口修改 案例说明: kingbaseES V8R3集群部署读写分离的集群是使用ssh的默认端口(22)部署,当改为非默认端口时,在 ...
- UE4 c++ -- 简单的UMG
说明 学习一下如何将Widget蓝图与C++连接起来,将处理逻辑写在C++中 基础 在蓝图中,我们显示Widget是通过一个Actor或者PlayerController,甚至关卡蓝图,利用Creat ...
- C#第一个helloworld程序
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 usin ...
- Apache服务器打开网页是乱码解决方案
当 Apache 服务器显示乱码时,可以使用两种方法解决: 1. 服务器端 可以在 Apache 的配置文件中添加以下内容来设置默认编码为UTF-8: AddDefaultCharset utf-8 ...
- 5 CSS伪类选择器
5 伪类选择器 anchor伪类:专用于控制链接的显示效果 More Actions:link a:link 选择所有未被访问的链接. :visited a:visited 选择所有已被访问的链接. ...
- AT-abc347(C,D)
AtCoder Beginner Contest 347 C - Ideal Holidays 这场做得最头疼的题 分析 容易想到先用$(d_i+a+b-1)%(a+b)+1$把$d_i$映射到$[1 ...
- #笛卡尔树,构造#洛谷 7726 天体探测仪(Astral Detector)
题目传送门 分析 考虑每个数字一定会影响一定的范围, 那么可以记录每个数影响的最长区间和产生的个数, 那么通过这个可以解方程求出对于这个最长区间这个数的所在位置, 可以发现它可以满足一个树形结构,直接 ...
- docker运行javaWeb服务,操作文件异常
一.问题由来 部署一个测试服务在自己的服务器上面,然后运行其中的一个功能.然后报错,报错信息如下 二.问题分析 自己一开始也很疑惑,怎么会出现这个问题呢,自己明明把对应的文件放在对应的目录下面,并且已 ...