Git 中上下文切换的 4 种方式
创始人
2024-03-02 07:23:13
0

比较 Git 中四种切换分支的方法的优缺点。

所有大量使用 Git 的人都会用到某种形式的上下文切换。有时这只会给你的工作流程增加少量的开销,但有时,这可能是一段痛苦的经历。

让我们用以下这个例子来讨论一些常见的上下文切换策略的优缺点:

假设你在一个名为 feature-X 的分支中工作。你刚刚发现你需要解决一个无关的问题。这不能在 feature-X 分支中完成。你需要在一个新的分支 feature-Y 中完成这项工作。

方案 1:暂存 + 分支

解决此问题最常见的工作流程可能如下所示:

  1. 停止分支 feature-X 上的工作
  2. git stash
  3. git checkout -b feature-Y origin/main
  4. 一顿鼓捣,解决 feature-Y 的问题
  5. git checkout feature-Xgit switch -
  6. git stash pop
  7. 继续在 feature-X 中工作

优点: 这种方法的优点在于,对于简单的更改,这是一个相当简单的工作流程。它可以很好地工作,特别是对于小型仓库。

缺点: 使用此工作流程时,一次只能有一个工作区。另外,根据你的仓库的状态,使用暂存是一个麻烦的环节。

方案 2:WIP 提交 + 分支

这个解决方案和前一个非常相似,但是它使用 WIP( 正在进行的工作 Work in Progress )提交而不是暂存。当你准备好切换回来,而不是弹出暂存时,git reset HEAD~1 会展开 WIP 提交,你可以自由地继续,就像之前的方案一样,但不会触及暂存。

  1. 停止分支 feature-X 上的工作
  2. git add -u(仅仅添加修改和删除的文件)
  3. git commit -m "WIP"
  4. git checkout -b feature-Y origin/master
  5. 一顿鼓捣,解决 feature-Y 的问题
  6. git checkout feature-Xgit switch -
  7. git reset HEAD~1

优点: 对于简单的更改,这是一个简单的工作流,也适合于小型仓库。你不需要使用暂存。

缺点: 任何时候都只能有一个工作区。此外,如果你或你的代码审阅者不够谨慎,WIP 提交可能会合并到最终产品。

使用此工作流时,你永远不要想着将 --hard 添加到 git reset。如果你不小心这样做了,你应该能够使用 git reflog 恢复提交,但是你最好完全避免这种情况发生,否则你会听到心碎的声音。

方案 3:克隆一个新仓库

在这个解决方案中,不是创建新的分支,而是为每个新的功能分支创建存储库的新克隆。

优点: 你可以同时在多个工作区中工作。你不需要 git stash 或者是 WIP 提交。

缺点: 需要考虑仓库的大小,因为这可能会占用大量磁盘空间(浅层克隆可以帮助解决这种情况,但它们可能并不总是很合适。)此外,你的仓库克隆将互不可知。因为他们不能互相追踪,所以你必须手动追踪你的克隆的源仓库。如果需要 git 钩子,则需要为每个新克隆设置它们。

方案 4:git 工作树

要使用此解决方案,你可能需要了解 git add worktree。如果你不熟悉 Git 中的工作树,请不要难过。许多人多年来都对这个概念一无所知。

什么是工作树?

将工作树视为仓库中属于项目的文件。本质上,这是一种工作区。你可能没有意识到你已经在使用工作树了。开始使用 Git 时,你将自动获得第一个工作树。

$ mkdir /tmp/foo && cd /tmp/foo
$ git init
$ git worktree list
/tmp  0000000 [master]

你可以在以上代码看到,甚至在第一次提交前你就有了一个工作树。接下来去尝试再添加一个工作树到你的项目中吧。

添加一个工作树

想要添加一个新的工作树你需要提供:

  1. 硬盘上的一个位置
  2. 一个分支名
  3. 添加哪些分支
$ git clone https://github.com/oalders/http-browserdetect.git
$ cd http-browserdetect/
$ git worktree list
/Users/olaf/http-browserdetect  90772ae [master]

$ git worktree add ~/trees/oalders/feature-X -b oalders/feature-X origin/master
$ git worktree add ~/trees/oalders/feature-Y -b oalders/feature-Y e9df3c555e96b3f1

$ git worktree list
/Users/olaf/http-browserdetect       90772ae [master]
/Users/olaf/trees/oalders/feature-X  90772ae [oalders/feature-X]
/Users/olaf/trees/oalders/feature-Y  e9df3c5 [oalders/feature-Y]

与大多数其他 Git 命令一样,你需要在仓库路径下使用此命令。一旦创建了工作树,就有了隔离的工作环境。Git 仓库会跟踪工作树在磁盘上的位置。如果 Git 钩子已经在父仓库中设置好了,那么它们也可以在工作树中使用。

请注意到,每个工作树只使用父仓库磁盘空间的一小部分。在这种情况下,工作树需要只大约三分之一的原始磁盘空间。这这非常适合进行扩展。如果你的仓库达到了千兆字节的级别,你就会真正体会到工作树对硬盘空间的节省。

$ du -sh /Users/olaf/http-browserdetect
2.9M

$ du -sh /Users/olaf/trees/oalders/feature-X
1.0M

优点: 你可以同时在多个工作区中工作。你不需要使用暂存。Git 会跟踪所有的工作树。你不需要设置 Git 钩子。这也比 git clone 更快,并且可以节省网络流量,因为你可以在飞行模式下执行此操作。你还可以更高效地使用磁盘空间,而无需借助于浅层克隆。

缺点: 这是个需要你额外学习和记忆的新东西,但是如果你能养成使用这个功能的习惯,它会给你丰厚的回报。

额外的小技巧

有很多方式可以清除工作树,最受欢迎的方式是使用 Git 来移除工作树:

git worktree remove /Users/olaf/trees/oalders/feature-X

如果你喜欢 RM 大法,你也可以用 rm -rf 来删除工作树。

rm -rf /Users/olaf/trees/oalders/feature-X

但是,如果执行此操作,则可能需要使用 git worktree prune 清理所有剩余的文件。或者你现在可以跳过清理,这将在将来的某个时候通过 git gc 自行完成。

注意事项

如果你准备尝试 git worktree,请记住以下几点:

  • 删除工作树并不会删除该分支。
  • 可以在工作树中切换分支。
  • 你不能在多个工作树中同时签出同一个分支。
  • 像其他命令一样,git worktree 需要从仓库内运行。
  • 你可以同时拥有许多工作树。
  • 要从同一个本地仓库签出创建工作树,否则它们将互不可知。

git rev-parse

最后一点注意:在使用 git worktree 时,仓库根所在的位置可能取决于上下文。幸运的是,git rev parse 可以让你区分这两者。

  • 要查找父仓库的根目录,请执行以下操作:
git rev-parse --git-common-dir
  • 要查找你当前所在仓库的根目录,请执行:
git rev-parse --show-toplevel

根据你的需要选择最好的方法

就像很多事情一样,TIMTOWDI( 条条大道通罗马 there’s more than one way to do it )。重要的是你要找到一个适合你需要的工作流程。你的需求可能因手头的问题而异。也许你偶尔会发现自己将 git worktree 作为版本控制工具箱中的一个方便工具。


via: https://opensource.com/article/21/4/context-switching-git

作者:Olaf Alders 选题:lujun9972 译者:Chao-zhi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

音画同步,AI视频也能有完...
机器之心报道 编辑:泽南 AI 生成的「最后一道关卡」已经突破...
2025-06-27 22:12:41
银河通用X清华大学发布首款...
该论文由清华大学与北京银河通用机器人有限公司合作完成。论文的共同第...
2025-06-12 17:11:39
【Git】pull 分支报...
报错消息 示例图: 示例代码: ➜ ...
2025-06-01 18:31:43
使用IDEA把项目上传到g...
使用IDEA把项目上传到gitee仓库在gitee上建立一个仓库第...
2025-06-01 17:15:00
本地新建项目如何推送到远程...
我本地新建了一个vue项目,想推送到远程的gitla...
2025-05-31 23:03:33
Windows环境安装及配...
欢迎关注博主 Mindtechnist 或加入【Linux C/C...
2025-05-31 21:41:26

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...